首页 > 解决方案 > 无法读取 sqlite 数据库中的更新数据

问题描述

我已经将其作为房间数据库多线程问题的一部分提出。我正在从 android 中的多个线程访问房间数据库,但是在所有线程中使用相同的数据库实例。

new Thread(new Runnable(){ 
  db.getInstance().taskdao().insertAll(list)
}).start();

new Thread(new Runnable(){
  List<Task> data = db.getInstance().taskDao.loadAll();
}).start();

但是返回的数据为空,我猜 loadAll() 在 insertAll() 完成之前被执行。请注意,在实际代码中,我使用的是 Rxjava,因此我确保在 loadAll() 完成后读取数据。为什么会发生这种情况,因为 sqlite 启用锁定以确保序列化访问。

标签: android

解决方案


如果您尝试在写入后立即阅读,请尝试设置回调。
您必须等到插入功能完成。假设写入数据库

需要10毫秒,启动线程需要 5 毫秒并转到下一个线程开始(读取的那个)。读取线程在第 6 毫秒开始读取,而写入尚未完成,将返回意外结果。 最好使用 an来处理回调。 简单的例子:

AsyncTask

class Task extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... voids) {
            db.getInstance().taskdao().insertAll(list);
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            CallBack c = (CallBack) context; // your activity that implements context
            c.onComplete();
        }
    }

对于接口和覆盖:

interface CallBack {
        void onComplete();
    }

并在您的活动中实施它:

@Override
public void onComplete() {
    //Now read it
}

推荐阅读