gpt4 book ai didi

android - 从 runInTransaction() 在 Android Room 数据库中返回值

转载 作者:行者123 更新时间:2023-12-04 12:41:54 25 4
gpt4 key购买 nike

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

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

方法如下:

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;
}

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

最佳答案

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

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

主要的功能区别在于 runInTransaction(Callable) 返回由 Callable 返回的值。

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

  • 要么在成功时返回图像,要么在失败时返回 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;
}

关于android - 从 runInTransaction() 在 Android Room 数据库中返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58038053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com