Phonegap存储

时间:2013-04-09 13:30:21

标签: javascript android cordova local-storage

简介

我花了一整天但我不明白我的手机应用程序中发生了什么。

在我的应用程序中使用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和标题,这没有任何问题。

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++;
     }
}

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

经过三天的调查,我终于找到了解决方案。我的数据库声明不够大:

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

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

我将其更改为:

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

这是20MB。

我仍然不明白为什么问题只出现在第一次加载数据上。

感谢所有的想法!