2012-10-13 41 views
2

這讓我瘋狂。當從數組中獲取數值時,SQLite DELETE事務不起作用

我有一個消息隊列,我正在使用本地存儲Web數據庫來存儲這些消息,當設備脫機,並且當有互聯網連接它發出這些消息。發送消息後,我希望它們從表中刪除。

當我發出消息時,我保留一個名爲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); 
      } 
     ); 
} 
+0

WebSQL異步工作。參見[WebSQL數據庫+ Javascript循環](http://stackoverflow.com/questions/4825455/web-sql-database-javascript-loop)。 (你也可以在一個查詢中執行所有的刪除操作:'executeSql(「DELETE FROM Messages where Message in(?,?,?,...)」,MessageIDs)')。 – DCoder

+0

哦,沒有辦法,我沒有意識到這是異步的,謝謝你的頭!我最終在for循環中使用了閉包技術,我沒有顯示這些代碼來填充SuccessID和ErrorIDs數組(因此我不會刪除發出問題的消息),然後調用一個單獨的方法根據SuccessID的數量刪除並動態創建我需要的數量,並按照您的建議在單個查詢中完成所有操作。工作順利。如果您想添加「答案」,我很樂意接受它! – Matt

回答

1

對不起,我不能把這個作爲一個評論,所以這裏作爲一個答案,延長DCoder的回答是:你也可以把循環中的事務中,那麼它會工作,太。不過,他的解決方案更清潔。

編輯:也許我應該給出一個理由說明爲什麼這個添加不是不重要的:顯然,你不能總是以這種方式組合查詢。因此,在開始嵌套事務之前,只需將查詢循環放入一個事務中即可。

+0

作爲對DCoder的回覆的補充:只要給予'executeSql'返回false的錯誤回調,那麼其他查詢(在同一個事務中)仍然會被調用! –