我有一个函数可以将一些数据保存到我的数据库中,并且在 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 模式,但速度非常慢。
一些想法?
最佳答案
我不太确定你的问题,但我看到了几个问题。
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。
关于javascript - phonegap 上的 db.transaction 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16042146/