android - Android Room @Query Insert Into getting Cannot access database on the main thread 因为它可能会长时间锁定 UI
问题描述
我正在执行一个需要长参数的 INSERT INTO 查询,但我得到一个“无法访问主线程上的数据库,因为它可能会长时间锁定 UI。” 错误并相信我需要将其作为异步任务运行,但无法找到要遵循的模式。我正在寻找插入查询,但需要推入两个长值以供查询使用,其中这个值传入一个注释数组,或类似的东西:
private static class InsertNoteRunAsyncTask extends AsyncTask<Note, Void, Void> {
private NoteDao noteDao;
private InsertNoteRunAsyncTask (NoteDao noteDao) {
this.noteDao = noteDao;
}
@Override
protected Void doInBackground(Note... notes) {
noteDao.insert(notes[0]);
return null;
}
}
如何异步触发带有两个参数的@Query?
更新 我在构建数据库时没有 .allowMainThreadQueries() :
public static synchronized AppDatabase getInstance(Context context) {
if (instance == null)
{
instance = Room.databaseBuilder(context.getApplicationContext(),
AppDatabase.class, "user-database")
.fallbackToDestructiveMigration()
.addCallback(roomCallback)
.build();
}
return instance;
}
解决方案
我最终创建了一个新的异步类并像这样调整它:
private static class InsertIntoNoteRunAsyncTask extends AsyncTask<Note, Void, Void> {
private NoteDao noteDao;
private InsertIntoNoteRunAsyncTask (NoteDao noteDao) {
this.noteDao = noteDao;
}
@Override
protected Void doInBackground(Note... notes) {
int id = notes[0].getId();
noteDao.insertInto(id);
return null;
}
}
推荐阅读
- node.js - 如何将转译的 babel 文件中的错误映射回源代码?
- scala - Scala中这两个代码段有什么区别
- cucumber - cucumber-jvm 上 .feature 文件的默认位置是什么?
- xml - 如何修复 xml-document 中的“标记必须格式正确”错误
- php - 写在一行上的 HTML 多个代码任务
- c - ASCII 字符没有被打印出来
- node.js - 运行离子时如何解决“构建失败,错误代码:1”?
- ruby - 如何使用 httparty 而不是 net/http 或 curl
- r - 在R中获取模式匹配之后和之前的字符
- javascript - 使用 Circle Ci 部署到外部服务器