2017-07-31 10 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'); 
}); 

問題は、私は2番目に使用する最初のインサートからの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はアシンクロナスであるため、ロケーション1はロケーション1の前に実行されます。 問題は次のとおりです。db.transactionが有効範囲外になったときに、ロケーション2の後にトランザクションが終了しますか? 「はい」の場合は、トランザクション終了後にロケーション1が実行されるため、トランザクション内での実行方法を教えてください。いいえ、それはコミットされるかロールバックされた場合

答えて

1

次の2つの非同期タスクをカスケード接続するための約束を使用する必要があります。

+0

回答も受け付けてください。あなたがまだ約束を書く方法を混乱させるかどうかを教えてください。 – enRaiser

関連する問題