[英]How to return a single object from room database?
As this document tells:正如本文件所述:
So I've returned a object TaskStat from the database(all tables in database are created successfully).所以我从数据库返回了一个 object TaskStat(数据库中的所有表都创建成功)。 My Dao is:
我的道是:
Dao.class
道.class
@Query("SELECT * FROM task_statistics WHERE owner_ID = :ownerId")
TaskStat getTaskStatOf(long ownerId);
Then I've called the getTaskStaOf()
method from Repository class
and further from ViewModel class
.然后我从
Repository class
和ViewModel class
调用了getTaskStaOf()
方法。 Here is the code for Repository & ViewModel:这是 Repository 和 ViewModel 的代码:
Repository
存储库
public TaskStat getTaskStatOf(Task task) {
return taskDao.getTaskStatOf(task.getTaskId());
}
ViewModel.class
查看型号.class
if (task.getProgress() == task.getMaxProgress()) {
TaskStat taskStat = taskRepository.getTaskStatOf(task);
taskStat.setStatus(true);
taskRepository.updateStat(taskStat);
}
But when I reach the first line of if()
condition in ViewModel the app crushes.. Log says:但是当我在 ViewModel 中到达
if()
条件的第一行时,应用程序崩溃了。日志说:
at androidx.room.RoomDatabase.assertNotMainThread(RoomDatabase.java:267)
at androidx.room.RoomDatabase.query(RoomDatabase.java:323)
at androidx.room.util.DBUtil.query(DBUtil.java:83)
at taskHelper.TaskDao_Impl.getTaskStatOf(TaskDao_Impl.java:276)
at taskHelper.TaskRepository.getTaskStatOf(TaskRepository.java:86)
at taskHelper.TaskViewModel.incrementProgress(TaskViewModel.java:46)
at com.example.mohasaba.MainActivity$2.onItemLongClick(MainActivity.java:71)
at taskHelper.TaskAdapter$TaskHolder$2.onLongClick(TaskAdapter.java:113)
at android.view.View.performLongClickInternal(View.java:7205)
at android.view.View.performLongClick(View.java:7163)
at android.view.View.performLongClick(View.java:7181)
at android.view.View$CheckForLongPress.run(View.java:27294)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
I'm confused where I'm doing wrong?我很困惑我做错了什么? Can you help me?
你能帮助我吗?
You can do this.你可以这样做。 In the ViewModel class change this lines:
在 ViewModel class 中更改以下行:
if (task.getProgress() == task.getMaxProgress()) {
TaskStat taskStat = taskRepository.getTaskStatOf(task);
taskStat.setStatus(true);
taskRepository.updateStat(taskStat);
}
to:至:
if (task.getProgress() == task.getMaxProgress()) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
TaskStat taskStat = taskRepository.getTaskStatOf(task);
taskStat.setStatus(true);
taskRepository.updateStat(taskStat);
}
});
thread.start();
}
Hope this will work.希望这会奏效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.