我正在构建一个主要针对iOS 7+的Phonegap应用程序。
我有一个本地SQLite数据库,我从服务器上复制干净。目前有几个表是空的(它们并不总是为空)。当我使用下面的代码时,不会填充result.insertId
值,而只会填充插入表中的第一行。在第一行之后,所有insertId
值都是正确的。
db.transaction(function (tx1) {
tx1.executeSql(insertSQL1, [arguments],
function (t1, result1) {
if (result1 != null && result1.rowsAffected > 0) {
logMessage("Result1:" + JSON.stringify(result1));
$.each(UserSelectedArrayOfItems, function (index, value) {
db.transaction(function (tx2) {
tx2.executeSql(insertSQL2, [result1.insertId, value],
function (t2, result2) {
if (result2 != null) {
logMessage("Result2: " + JSON.stringify(result2));
}
},
function (t2, error) {
logMessage("There was an error: " + JSON.stringify(error));
});
});
});
<< Do app Navigation if all was ok >>
}
},
function (t, error) {
logMessage("Error: " + JSON.stringify(error));
});
});
测试时,两个表都开始为空。零行。两者都有一个ID列,其属性为INTEGER PRIMARY KEY
。插入确实有效,它的ID值为1.表中ID正确,但事务成功回调中result.insertId
未定义。
logMessage
函数将字符串写入文件,以便我可以调试/支持应用程序。将1行插入父表(总是只有一行到父表)和2行到子表(可能是1到n行)时的示例日志消息:
Result1: {"rows":{"length":0},"rowsAffected":1}
Result2: {"rows":{"length":0},"rowsAffected":1}
Result2: {"rows":{"length":0},"rowsAffected":1,"insertId":2}
之前有没有人见过这种行为?我使用以下插件:
<gap:plugin name="com.millerjames01.sqlite-plugin" version="1.0.1" />
答案 0 :(得分:0)
是的,我发现在使用结果(或行)中的值时,最佳做法是首先将对象的值计算为新变量,然后将新变量传递给另一个函数调用并执行工作那里。作为我的例子的更新:
db.transaction(function (tx1) {
tx1.executeSql(insertSQL1, [arguments],
function (t1, result1) {
if (result1 != null && result1.rowsAffected > 0) {
logMessage("Result1:" + JSON.stringify(result1));
var newID = result1.insertId;
$.each(UserSelectedArrayOfItems, function (index, value) {
DoWork(newID, value);
});
<< Do app Navigation if all was ok >>
}
},
function (t, error) {
logMessage("Error: " + JSON.stringify(error));
});
});
function DoWork(id, value){
db.transaction(function (tx2) {
tx2.executeSql(insertSQL2, [id, value],
function (t2, result2) {
if (result2 != null) {
logMessage("Result2: " + JSON.stringify(result2));
}
},
function (t2, error) {
logMessage("There was an error: " + JSON.stringify(error));
});
});
}
您需要添加任何支票或退货,以便确认一切按预期进行。但这就是为我解决问题的总体要点。