【问题标题】:SQLite DELETE transaction not working when grabbing value from Array从数组中获取值时 SQLite DELETE 事务不起作用
【发布时间】:2012-10-04 01:34:09
【问题描述】:

这快把我逼疯了。

我有一个消息队列,当设备离线并且有互联网连接时它会发送这些消息时,我正在使用本地存储网络数据库来存储这些消息。在它发送消息后,我希望它们从表中删除。

当我发送消息时,我会保留一个名为 MessageIDs 的数组,这样我就可以引用需要删除的行。

我遍历 MessageID 的长度并获取每个 ID 并进行 DELETE 事务。我的 alert() 获得了正确的值,但是当事务执行时,该值未定义。我尝试将一个已知的“ID”硬编码到事务中并且它起作用了。有什么想法吗?

 var MessageIDs = new Array();

//In the block of code not shown I populate MessageIDs and send out messages

for(var j=0; j < MessageIDs.length; j++)
{
  alert(MessageIDs[j]); //Pulls the right value
  site.data.database.transaction(  
            function (transaction) {  
                //[MessageIDs[j]] has a value of undefined and thus doesn't get deleted but the transaction doesn't technically fail either
                transaction.executeSql("DELETE FROM Messages WHERE id = ?;", [MessageIDs[j]],  
                    site.contact.removeQueuedMessagesSuccess, site.contact.removeQueuedMessagesError);  
            }  
        ); 
}

【问题讨论】:

  • WebSQL 异步工作。见WebSQL Database + Javascript loop。 (您也可以在一个查询中完成所有删除操作:executeSql("DELETE FROM Messages WHERE id IN(?, ?, ?, ...)", MessageIDs))。
  • 哦,我没有意识到它是异步的,感谢您的提醒!我最终在我没有显示的代码中的 for 循环上使用了闭包技术来填充 SuccessID 和 ErrorID 数组(所以我不会删除发送有问题的消息),然后调用一个单独的方法来容纳我需要根据 SuccessID 的数量删除和动态创建?的数量,并按照您的建议在单个查询中完成所有操作。工作顺利。如果您想添加“答案”,我很乐意接受!

标签: javascript sql html sqlite web-storage


【解决方案1】:

抱歉,我不能将此作为评论,所以在这里作为答案,扩展 DCoder 的答案:您也可以将循环放在事务中,然后它也可以工作。不过,他的解决方案更干净。

编辑:也许我应该说明为什么这个添加并不重要:显然,你不能总是以这种方式组合查询。因此,在开始嵌套事务之前,只需将查询循环放在一个事务中即可。

【讨论】:

  • 作为对 DCoder 回复的补充:只要给executeSql 一个返回 false 的错误回调,那么其他查询(在同一事务中)仍然会被调用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 2019-10-01
  • 1970-01-01
  • 2019-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多