我有一个功能,可以将一些数据保存到我的数据库,并且所有功能在cordova 2.4上工作正常,但我升级到了cordova 2.6,我开始遇到一些问题,我的数据库很慢,因为回调问题开始出现问题
我的第一个问题是当我调用tx.executeSql时,db.transaction的回调会触发
function populateDB(tx) {
tx.executeSql('DROP TABLE IF EXISTS DEMO'); /* <-- succesCB is fired */
tx.executeSql('CREATE TABLE IF NOT EXISTS DEMO (id unique, data)'); /* <-- succesCB is fired again */
tx.executeSql('INSERT INTO DEMO (id, data) VALUES (1, "First row")'); /* <-- succesCB is fired again */
tx.executeSql('INSERT INTO DEMO (id, data) VALUES (2, "Second row")'); /* <-- succesCB is fired again */
}
function errorCB(err) {
alert("Error processing SQL: "+err.code);
}
function successCB() {
alert("success!");
}
var db = window.openDatabase("Database", "1.0", "Cordova Demo", 200000);
db.transaction(populateDB, errorCB, successCB);
在升级之前它在事务函数结束时被触发(在这种情况下是populateDB),在最后也会触发chrome。
这是正确的行为吗?是在executeSql上还是在populateDB结束时触发?
我在Galaxy S2(4.1.2),华硕Transformer TF101(4.0.3),Galaxy Tab(4.0.4)上有相同的行为
我的第二个问题是,当我插入所有数据时需要很长时间,对于13000条记录大约需要5分钟我尝试插入像INSERT INTO mytable (id, x) VALUES (1, "sas"), (2, "dsfdsf"), ...
这样的值并且速度要快得多,但它只适用于使用sqlite&gt; = 3.7.11,所以我尝试了UNION SELECT模式,但速度很慢。
一些想法?
答案 0 :(得分:1)
我不确定你的问题,但我看到了几个问题。
WebSQL版本化的开放被破坏了。建议的打开过程在没有版本的情况下打开,然后使用版本更改事务,如下所示
var db = window.openDatabase("Database", '', "Cordova Demo", 200000)
if (db.version != '1.0') {
db.versionChange(...)
}
另一个是从请求回调中重用tx。
tx.executeSql('DROP TABLE IF EXISTS DEMO', [], function (t, r) {
t.executeSql('CREATE TABLE IF NOT EXISTS DEMO (id unique, data)');
});
从您的代码中,tx执行不是有序的。浏览器可以按任何顺序执行所有四个。
关于两个window.openDatabase
,一个是浏览器原生(如果支持),另一个是通过phonegap通过插件进行polyfill。
答案 1 :(得分:0)
最好使用html5数据库而不是phonegap的数据库。