如何使用Ionic 2和SQLite上的事务和依赖记录?

问题描述 投票:1回答:2

我正在用SQLite创建一个Ionic 2应用程序。我已经能够成功执行命令,创建表并在数据库上插入记录。现在我正在尝试插入一些父记录和详细记录,并且我想在事务中执行此操作,以便在插入子记录时发生任何错误时,我将不会有一个损坏的父记录。

那么,根据这个链接(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之前执行。问题是:当db.transaction超出范围时,事务是否会在位置2之后完成?如果是,则事务完成后将执行位置1,那么如何在事务内执行?

如果不是,什么时候会被提交或回滚?

sqlite ionic-framework transactions ionic2
2个回答
1
投票

您必须使用promise级联两个异步任务。


0
投票

你必须使用两个结果。

  db.transaction(function (tx) {      
    tx.executeSql("Insert into ParentTable(ParentName) values ('name')",[],
    function (tx, result) {
      tx.executeSql("Insert into ChildTable(ParentID, ChildName) values (?, 'value1')", [result.insertId],
        function (tx, result) {
          console.log(result);
        },
        function (error) {
          console.log(error);
        });
    },
    function (error) {
      console.log(error);
    });
  });
© www.soinside.com 2019 - 2024. All rights reserved.