在phonegap上db.transaction的问题

时间:2013-04-16 16:21:09

标签: javascript android cordova web-sql

我有一个功能,可以将一些数据保存到我的数据库,并且所有功能在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模式,但速度很慢。

一些想法?

2 个答案:

答案 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的数据库。