- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
没有太多的文档来了解 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()
,否则将被视为失败并将被回滚)。<Callable
或 Runnable
中抛出异常,则不处理该异常(在 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/
我接管的应用有这段代码: db.RunInTransaction(() => { foreach (CategorySource category in categories)
使用以下代码时出现编译错误: Suspension functions can be called only within coroutine body 有人可以向我解释为什么吗?我需要做什么才能使其
我正在尝试弄清楚 RunInTransaction 最终会做什么。 Room 文档除了“在数据库事务中执行指定的 Runnable”之外没有说太多。 据我了解: 如果我们有一个像查询这样的异步操作,然
没有太多的文档来了解 runInTransaction() 方法究竟是如何工作的。在不同的 DAO 上执行多个操作时,如果没有返回值,我可以使用 runInTransaction(Runnable b
我构建的数据库结构就像一条链,它看起来像这样: Click here to see the structure 这些部分在哪里: Click here to see what represents e
我是一名优秀的程序员,十分优秀!