我已经将此问题作为问题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启用了锁定以确保序列化访问。
答案 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
}