【问题标题】:Problems with db.transaction on phonegapphonegap 上的 db.transaction 问题
【发布时间】:2013-04-09 03:49:12
【问题描述】:

我有一个函数可以将一些数据保存到我的数据库中,并且在 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 条记录,我尝试插入像 INSERT INTO mytable (id, x) VALUES (1, "sas"), (2, "dsfdsf"), ... 这样的值大约需要 5 分钟,而且速度要快得多,但它只在使用 sqlite 时有效> = 3.7.11,所以我尝试了 UNION SELECT 模式,但真的很慢。

有什么想法吗?

【问题讨论】:

    标签: javascript android cordova web-sql


    【解决方案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。

    【讨论】:

    • 感谢很高兴知道所有这些东西,但它并没有解决我的问题。一个cordova(phonegap)developer告诉我问题是因为android 4.0在webSQL上使用了shim,但我仍然认为这是一个错误,因为在cordova 2.5上它可以工作,而在cordova 2.6它没有。我会花时间查看cordova文件并找出差异。
    • 为什么不试试我的数据库库bitbucket.org/ytkyaw/ydn-db它会起作用的。
    【解决方案2】:

    最好用html5数据库代替phonegap的数据库。

    【讨论】:

    • 这里的问题是两者的调用方式完全相同window.openDatabase("Database", "1.0", "Cordova Demo", 200000)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多