【问题标题】:Phonegap Storage电话间隙存储
【发布时间】:2013-03-31 23:09:46
【问题描述】:

简介

我花了一整天的时间,但我就是不明白我的 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++;
     }
}

【问题讨论】:

标签: javascript android cordova local-storage


【解决方案1】:

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

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

【讨论】:

  • 在他们自己的文档中,他们也使用了一个 for 循环,这就是我从中得到这个方法的原因:docs.phonegap.com/en/2.5.0/…
  • 在PhoneGap docs中,结果是从数据库查询回调函数的结果集中循环的。在您的情况下,您正在循环多个数据库查询。差别很大。
  • 你是对的,我已经重写了代码,它在第一篇文章中(编辑 2)。但是,如果我尝试加载超过 39 个帖子,错误仍然存​​在。
【解决方案2】:

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

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

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

我把它改成了:

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

20MB。

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

感谢大家的思考!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多