android - 无法读取 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 启用锁定以确保序列化访问。
解决方案
如果您尝试在写入后立即阅读,请尝试设置回调。
您必须等到插入功能完成。假设写入数据库
需要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
}
推荐阅读
- javascript - 在 Javacript 中测试反应
- reactjs - 状态更新不影响视图
- r - 我无法将我的地块放到一个网格中,请帮助纠正我的代码
- ruby-on-rails - 如何更新 Rails ruby 次要版本
- python - Django .save() 方法未出现在 Visual Studio Code 中
- java - 我们可以将标记接口定义为 DynamoDB 属性/文档吗?
- python - 无法解析导入“电报”(在 MacOS 上)
- python - 衰减与函数叠加
- c# - 将事件日志从远程服务器导出到另一个共享文件夹
- python - 如何将具有多字名称的行添加到熊猫数据框中