2013-04-09 75 views
0

介绍PhoneGap的存储

我已经花了一整天,但我就是不明白什么在我的PhoneGap aplication发生。

在使用PhoneGap的从本地存储我的应用程序即时通讯,存储从网页检索到的新闻消息。我这样做是因为我希望用户能够脱机观看内容。

当他们上线的应用程序将简单地发送其最后一次更新日期的网站,该网站将只发送更改的记录背部和应用程序并将其存储在本地数据库一次。

这一切都加载数据的时候第一次作品不错,exept。

问题

当我开始了第一次的应用程序,它需要与网站上提供的所有记录填充数据库。 (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++; 
    } 
} 
+0

可能相关:http://stackoverflow.com/questions/4825455/web-sql-database-javascript-loop – pawel 2013-04-09 14:09:15

回答

0

经过三天的调查,我终于找到了解决办法。我的数据库未声明足够大:

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

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

我把它改为:

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

这是20MB。

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

感谢您的所有想法!

0

我认为你必须使下面的SQL语句成为前一个回调,而不是通过'for'循环它们。

现在无法提供示例,对不起。

+0

在有自己的文档他们还利用一个for循环,这就是我从得到这个方法: HTTP ://docs.phonegap.com/en/2.5.0/cordova_storage_storage.md.html#SQLResultSetRowList – 2013-04-09 14:23:54

+1

在PhoneGap文档中,结果是从数据库查询的回调函数的结果集中循环的。在你的情况下,你正在循环多个数据库查询。有很大的差异。 – zvona 2013-04-09 19:41:49

+0

你说得对,我已经重写了代码,它在第一篇文章中(编辑2)。但是,如果我尝试加载超过39个帖子,错误仍然存​​在。 – 2013-04-11 18:29:11