无法读取sqlite数据库中的更新数据

时间:2018-07-20 14:44:07

标签: android

我已经将此问题作为问题multi threadaing with room database的一部分。 我正在从Android中的多个线程访问会议室数据库,但是在所有线程中使用相同的databse实例。

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

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

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

1 个答案:

答案 0 :(得分:2)

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

假设写入数据库需要 10ms ,启动线程并需要 5ms进入下一个线程(读取的线程)。 读取线程在写入尚未完成的第6毫秒开始读取,并将返回意外结果。

最好使用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
}