1

我有一个函数可以将一些数据保存到我的数据库中,并且在 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)、Asus Transformer TF101 (4.0.3)、Galaxy Tab (4.0.4) 上有相同的行为

我的第二个问题是,当我插入所有数据时,它需要很长时间,对于 13 000 条记录,我尝试插入类似的值大约需要 5 分钟INSERT INTO mytable (id, x) VALUES (1, "sas"), (2, "dsfdsf"), ...,而且速度要快得多,但它仅在使用 sqlite >= 3.7.11 时才有效,所以我尝试了 UNION SELECT 模式,但速度真的很慢。

一些想法?

4

2 回答 2

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 执行没有排序。浏览器可以按任意顺序执行所有四个 then。

关于两个window.openDatabase,一个是浏览器原生(如果支持),另一个是通过插件通过 phonegap 进行的 polyfill。

于 2013-04-17T00:05:13.113 回答
0

最好使用 html5 数据库而不是 phonegap 的数据库。

于 2013-04-16T16:48:54.553 回答