2017-07-31 53 views
0

我是用SQLite創建一個Ionic 2應用程序。我已經能夠執行命令,創建表並在成功的情況下在數據庫上插入記錄。現在我試圖插入一些父記錄和詳細記錄,並且我希望在事務內部這樣做,以便在插入子記錄時發生任何錯誤時,我不會有破損的父記錄。如何使用Ionic 2和SQLite的事務和從屬記錄?

那麼,根據這個鏈接(https://github.com/litehelpers/Cordova-sqlite-storage),我可以通過以下方式使用事務:

db.transaction(function(tx) { 
    tx.executeSql("Insert into ParentTable(ParentName) values ('name')"); 
    tx.executeSql("Insert into ChildTable(ParentID, ChildName) values (0, 'value1')"); 
}, function(error) { 
    console.log('Transaction ERROR: ' + error.message); 
}, function() { 
    console.log('Transaction OK'); 
}); 

的問題是,我需要從第一插入得到PARENTID在第二次使用插。 insertSQL命令有一個回調,所以我寫下面的代碼:

db.transaction(function(tx) 
{ 
    tx.executeSql("Insert into ParentTable(ParentName) values ('name')", 
     function(tx, rs) 
     { 
      /* Location 1 */ 
      var parentID = rs.insertId; 
      tx.executeSql("Insert into ChildTable(ParentID, ChildName) values (?, 'value1')", [parentID]); 
     }); 
    /* Location 2 */ 
}, function(error) { 
    console.log('Transaction ERROR: ' + error.message); 
}, function() { 
    console.log('Transaction OK'); 
}); 

所以,這是我的疑問。由於executeSql是異步的,位置2將在位置1之前執行。 問題是:事務在位置2之後完成,db.transaction超出範圍嗎? 如果是,位置1將在事務完成後執行,那麼如何在事務內部執行它?

如果否,它將在何時提交或回滾?

回答

1

您必須使用承諾級聯兩個異步任務。

+0

也請接受答案。讓我知道你是否仍然對如何寫承諾感到困惑。 – enRaiser