从 Android Room 数据库中的 runInTransaction() 返回值

Returning value from runInTransaction() In Android Room database

没有太多的文档来了解 runInTransaction() 方法究竟是如何工作的。 在不同的 DAO 上执行多个操作时,如果没有值被 returned 我可以使用 runInTransaction(Runnable body)runInTransaction(Callable<V> body) 如果任何结果被 returned.

我有的查询: 如果交易中的所有查询都成功,那么我想 return 一个图像对象,需要在交易成功时上传到服务器 如果发生任何异常或交易不成功,我需要 return 一个带有 false 的布尔值来指示用户发生了某些错误。

方法如下:

public boolean userCheckedIn(final User user) {
    try {
        appDatabase.runInTransaction(new Callable<Object>() {
            @Override
            public Object call() throws Exception {
                if (user != null) {

                   //Add entry in table A
                     appDatabase.UserDao().add(user);

                   //Update entry in table B 

                   //Delete an entry from table C 

                    Event image = updateUserAction(action);
                    return image;
                }
                return null;
            }
        });

    } catch (Exception e) {
        return false;
    }
    return true;
}

在上面的方法中,我打算做的是,如果所有的数据库执行都成功了,我需要return 一张图片上传到服务器。如果在执行数据库事务时发生任何异常或发生任何错误,我需要 return false 让用户知道发生了错误。不确定我是否做对了。另外,我应该将 runInTransaction 放在 try catch 块中吗?

runInTransaction(Callable) 的代码等同于 runInTransaction(Runnable) 版本:

  • 如果事务成功(即没有抛出异常),它会将事务设置为成功(通过调用 setTransactionSuccessful(),否则将被视为失败并回滚)。
  • 在任何情况下都结束事务(此时,如果它被设置为成功,则整个事务被提交,否则被回滚)。
  • 如果在 CallableRunnable 中抛出异常,则不会处理该异常(在 Callable 情况下会处理,但会重新抛出)。这意味着您需要在调用 runInTransaction(Callable)runInTransaction(Runnable).
  • 的代码中处理它

主要的功能区别在于 runInTransaction(Callable) return 是由 Callable 编辑的值 return。

所以,您的代码可以做两件事:

  • 成功时return图像或失败时null图像,并在调用userCheckedIn(User)
  • 的方法中上传图像
  • 在您的 userCheckedIn(User) 方法中上传图片

第二个解决方案(如果我没有调用 userCheckedIn(User) 的方法的代码,我更容易向您展示代码)看起来类似于:

public boolean userCheckedIn(final User user) {
    try {
        Event image = appDatabase.runInTransaction(new Callable<Object>() {
            @Override
            public Object call() throws Exception {
                if (user != null) {
                    //Add entry in table A
                    appDatabase.UserDao().add(user);

                    //Update entry in table B 

                    //Delete an entry from table C 

                    Event image = updateUserAction(action);
                    return image;
                }
                return null;
            }
        });
        if (image != null) {
            // Upload the image to the server
        } else {
            // No image available (probably because of the "if (user != null)"
            // inside Callable). I assume you want to return false in this case.
            return false;
        }

    } catch (Exception e) {
        return false;
    }
    return true;
}