0

介绍

我已经度过了一整天,但我只是不明白我的 phonegap 应用程序中发生了什么。

在我的应用程序中,我使用 phonegap 的本地存储来存储从网页检索到的新闻消息。我这样做是因为我希望用户能够离线观看内容。

当他们上线时,应用程序只会将其最后更新日期发送到网站,网站只会将更改的记录发回,应用程序将其再次存储在本地数据库中。

这一切都很好,除了第一次加载数据时。

问题

当我第一次启动该应用程序时,它需要用网站上可用的所有记录填充数据库。(201 行)但是当我尝试加载超过 39 条消息时,它会创建一个未定义的 sql 错误。

但是,我可以更改 php 脚本,因此它只会发送 39 个结果。应用程序第一次加载后,我可以再次更改脚本,这样它就会发送所有记录,并且可以完美运行。

让问题更加复杂的是,在我的应用程序每次启动时,所有表都会被删除并重新创建(当然这仅用于开发目的,最终版本中不会包含删除)。重新启动应用程序后,它将毫无问题地加载 201 条记录。

要再次重现该问题,我必须完全卸载该应用程序,然后重新安装。

代码

存储结果的代码:

var q = 'INSERT OR REPLACE INTO NIEUWS (id, title, introtext, catid) VALUES (?, ?, ?, ?)';
var len = contents.length;
for (var i=0; i<len; i++){
    tx.executeSql(q, [contents[i].id, contents[i].title, contents[i].introtext, contents[i].catid]);
}

启动代码:

tx.executeSql('DROP TABLE IF EXISTS NIEUWS');
tx.executeSql('CREATE TABLE IF NOT EXISTS NIEUWS (id PRIMARY KEY, title TEXT, introtext TEXT, catid INTEGER)');

我真的希望这个问题对你们中的一些人有意义,因为我现在完全迷路了。

提前致谢!

编辑 1 只是试图只保存 id 和 title,这没有任何问题。

var q = 'INSERT OR REPLACE INTO NIEUWS (id, title) VALUES (?, ?)';
var len = contents.length;
for (var i=0; i<len; i++){
    tx.executeSql(q, [contents[i].id, contents[i].title]);
}

编辑2 重写代码等待回调,同样的错误仍然存​​在。

function HandleNewsQuery(tx){
    var q = 'INSERT OR REPLACE INTO NIEUWS (id, title, introtext, catid) VALUES (?, ?, ?, ?)';
    if(c < contents.length){
        tx.executeSql(q, [contents[c].id, contents[c].title, contents[c].introtext, contents[c].catid], HandleNewsQuery, errorCB);
        c++;
     }
}
4

2 回答 2

0

我认为您必须将以下 SQL 语句作为前一个 SQL 语句的回调,而不是使用“for”循环它们。

目前无法提供示例,抱歉。

于 2013-04-09T13:37:12.607 回答
0

经过三天的研究,我终于找到了解决方案。我的数据库没有声明足够大:

var db = window.openDatabase("test", "1.0", "Test DB", 200000);

大小以字节为单位,所以实际上这个数据库只有 200KB

我将其更改为:

var db = window.openDatabase("test", "1.0", "Test DB", 20000000);

这是20MB。

我仍然不明白为什么问题只存在于第一次加载数据时。

谢谢大家的思考!

于 2013-04-11T19:55:10.777 回答