【问题标题】:How to return a single object from room database?如何从房间数据库中返回单个对象?
【发布时间】:2020-05-14 11:18:18
【问题描述】:

正如document 所说:

所以我从数据库中返回了一个对象TaskStat(数据库中的所有表都已成功创建)。我的道是:

道.class

    @Query("SELECT * FROM task_statistics WHERE owner_ID = :ownerId")
    TaskStat getTaskStatOf(long ownerId);

然后我从Repository classViewModel class 调用了getTaskStaOf() 方法。这是 Repository 和 ViewModel 的代码:

存储库

public TaskStat getTaskStatOf(Task task) {
        return taskDao.getTaskStatOf(task.getTaskId());
    }

ViewModel.class

if (task.getProgress() == task.getMaxProgress()) {
                TaskStat taskStat = taskRepository.getTaskStatOf(task);
                taskStat.setStatus(true);
                taskRepository.updateStat(taskStat);
            }

但是当我到达 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)

我很困惑我哪里做错了!你能帮帮我吗?

【问题讨论】:

  • 这个错误表明 Room 不允许在主线程上与 Sqlite 交互(查询和更改)。您应该在另一个线程上切换所有这些操作。 SO上有很多关于这个的答案,here 其中之一

标签: java android-studio android-room


【解决方案1】:

你可以这样做。在 ViewModel 类中更改以下行:

if (task.getProgress() == task.getMaxProgress()) {
                TaskStat taskStat = taskRepository.getTaskStatOf(task);
                taskStat.setStatus(true);
                taskRepository.updateStat(taskStat);
            }

到:

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

希望这会奏效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多