Android Room框架抛出illegalStateException:尝试打开已经关闭的数据库

时间:2017-08-30 06:34:21

标签: android database

我按照Google here提供的示例代码进行了Room库的存储。 我正在一个单独的线程上执行查询并加入每个查询线程,所以一旦一个线程完成,那么只有其他人会认为它会解决问题,但事实并非如此。现在我正在主线程上运行查询以使其现在正常工作。 任何人都可以告诉我如何使用单独的线程为每个查询使用此库。 我的查询是这样的 -

    public static void insertUserDetails(Context context, User user, QueryResultCallback listener) {
        Runnable r = () -> {
            try {
                long id = AppDatabase.getDatabase(context).userModel().insert(user);
                getHandler().post(() -> listener.onSuccess(id));
            } catch (Exception e) {
                getHandler().post(() -> listener.onFailure(e));
            }
        };
        runQuery(r);
    }

和runQuery方法 -

private static void runQuery(Runnable runnable) {
        Thread t = new Thread(runnable, DATABASE_THREAD);
        t.start();
        try {
            t.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

1 个答案:

答案 0 :(得分:0)

要对Room执行插入操作,您可以使用Android WorkManager在辅助线程上运行任务,并避免在主/ ui线程上运行任务。此外,请检查来自Google samples的kotlin示例代码,其中bulk insert中的一个已完成,并从JSON文件获取输入。此外,在构建数据库时,通过WorkManager as here批准了该工作。让我知道您是否需要更简单的代码或Java代码来了解如何在工作线程上完成插入操作。