房间数据库事务回滚

Ale*_*ioc 5 sqlite android android-room

使用房间数据库,我从不同DELETE的.INSERTDAO's

我将交易用作:

myDb.runInTransaction(new Runnable() {
     @Override
     public void run() {
     }
});
Run Code Online (Sandbox Code Playgroud)

有没有办法ROLLBACK万一出现任何问题?

稍后编辑: 使用这种模式似乎有效:

myDb.beginTransaction();
if(success){
 myDb.setTransactionSuccessful(); -> commit
}
myDb.endTransaction();
Run Code Online (Sandbox Code Playgroud)

Xav*_*ana 2

如果发生异常,事务不会被设置为成功,这意味着事务结束时会回滚。这是代码runInTransaction()

public void runInTransaction(Runnable body) {
    beginTransaction();
    try {
        body.run();
        setTransactionSuccessful();
    } finally {
        endTransaction();
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,您可以按照以下方式创建一些内容:

try {
    myDb.runInTransaction(new Runnable() {
        @Override
        public void run() {
            // DELETE
            if (failed) {
                throw new Exception("failed"); // ROLLBACK
            }
            // INSERT
        }
    });
} catch (Exception ex) {
    // Error handling
}
Run Code Online (Sandbox Code Playgroud)

由于Runnable代码是同步调用的。

而且,如果代码使用 lambda 而不是Runnable匿名类,它看起来会更干净。:)