更新:上次我遇到了这个烦人的问题,清除缓存/重启
对我有用。 唉
在调试模式下运行应用程序(Win: Shift+F9或Mac: Control+D),有时会为我解决问题。
不确定这是否是一个 bug。Android 文档没有提到这一点,所以我想它应该在普通模式下工作,但由于某种原因对我来说并没有起作用。
我使用(Android Studio 4.2 beta 3)。属性minSdkVersion
设置为27。
我不使用 Room 或任何其他 ORM,只是一些最简单的查询。
切换开关 '保持数据库连接打开' 似乎也没有帮助。
在普通模式下:
在调试模式下(我想要的):
值得注意的是,即使我停止了在调试模式下运行的应用程序,它仍然可以持续工作(查询数据库等):
我遇到了同样的问题,尝试了很多方法但都没有奏效,最终在一天之后才发现了问题。
问题就在于我使用了加密的SQLite数据库(自定义的 openHelperFactory)。
对我来说,删除 openHelperFactory 之后问题就解决了。
它完美地解决了我的问题,也许对你没有用,但肯定会对其他人有用。
谢谢!
我认为“closed”的原因很可能是我使用的框架(Exposed/SQLDroid)在数据库连接不起作用时会关闭连接。
所以,即使应用程序一切正常运行,当Database Inspector想要查看它时,数据库也会关闭。
添加下面的代码基本上解决了这个问题。 我不会将其放入生产代码中,因为我没有仔细检查发生了什么,但它在开发过程中有所帮助。
val db = openOrCreateDatabase("testdb.db", MODE_PRIVATE, null)
// db.close() -- DO NOT USE THIS
重要的是不要使用db.close()
。当有db.close()
时,数据库检查器会显示数据库已关闭。当没有它时,数据库检查器通常可以正常工作。
//yourDatabaseName.close();
然后再次运行并希望它能正常工作。
完成后不要忘记取消注释这一行。启用“保持数据库连接打开”。如下图所示:
LazyDatabase _openConnection() {
return LazyDatabase(() async {
final dbFolder = await getDatabasesPath();
final file = File(p.join(dbFolder, 'db.sqlite'));
if(Platform.isAndroid){
return SqfliteQueryExecutor.inDatabaseFolder(path: 'db.sqlite');
}else {
return NativeDatabase(file);
}
});
}
if (instance == null) {
instance = Room.databaseBuilder(
context,
TheDatabase.class,
DATABASE_NAME
)
.addCallback(callback)
.allowMainThreadQueries()
.build();
}
instance.getOpenHelper().getWritableDatabase(); //<<<<< FORCE OPEN
return instance;