从 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()
,否则将被视为失败并回滚)。
- 在任何情况下都结束事务(此时,如果它被设置为成功,则整个事务被提交,否则被回滚)。
- 如果在
Callable
或 Runnable
中抛出异常,则不会处理该异常(在 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;
}
没有太多的文档来了解 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()
,否则将被视为失败并回滚)。 - 在任何情况下都结束事务(此时,如果它被设置为成功,则整个事务被提交,否则被回滚)。
- 如果在
Callable
或Runnable
中抛出异常,则不会处理该异常(在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;
}