Android Studio 数据库检查器始终将数据库显示为 "closed"

Android Studio Database Inspector always showing database as "closed"

我正在尝试在 Android Studio 中使用 Database Inspector。为什么我 运行 设备上的应用程序,检查器总是将我的应用程序数据库(在图像中突出显示)显示为“已关闭”。

是否有解决此问题的方法,或者我在设置过程中是否遗漏了什么?

我没有很好的答案,但这里有一些其他可能的方法:

从您的屏幕截图中,我看到您已经完成了此操作,但对于其他人...听起来 this 是您应该能够完成此工作的方式 -

Additionally, you can prevent database connections from closing by toggling Keep database connections open from off () to on () at the top of the Databases pane.

...但这对我不起作用,所以我最终转到设备文件资源管理器,将我感兴趣的数据库保存到我的桌面,然后在那里使用它。

我也很幸运地使用了这个工具: https://github.com/amitshekhariitbhu/Android-Debug-Database

我遇到了同样的问题,我尝试了很多方法但都没有用,终于在我知道这个问题的一天后。 问题是我使用的是加密的 SQLite 数据库(自定义 openHelperFactory)。

对我来说,这是删除 openHelperFactory

后的问题

它工作得很好,我的回答可能对你没有用,但肯定对某些人有用。

谢谢

更新。上次我遇到这个恼人的问题 Invalidate cache/Restart 为我解决了这个问题。 感叹

运行 处于调试模式的应用程序 (Win:Shift+F9 或 Mac:Control+D)有时对我来说很神奇。

不确定这是否是错误。 The android documentation 没有提到这个,所以我想它应该只在正常模式下工作,但由于某些原因不适合我..

我使用 (Android Studio 4.2 beta 3)。 属性 minSdkVersion 设置为 27.

我不使用 Room 或任何其他 ORM,只是一些最简单的查询。

开关 'Keep database connection open' 似乎也没有帮助。

普通模式下:

在调试模式下(我想要的):

值得注意的是,即使我在调试模式下停止了应用程序 运行,它仍然继续工作(查询数据库等):

不确定这是否有帮助,但您可能为数据库检查器选择了错误的 emulator/device。

您可以单击图中所示的模拟器名称,为您的数据库检查器更改模拟器。

更新 Room 版本(目前 2.2.6)对我有用,但发行说明中没有提到任何此类错误。我怀疑它可能与缓存有关,所以也许这也值得一试

就我而言,我使用的是 SQLite 数据库。 我刚刚评论了这一行:

//yourDatabaseName.close();

然后再次 运行,希望它有效。

不要忘记在完成后取消注释该行。

启用“保持数据库连接打开”。见下图

对我来说,“关闭”的原因很可能是我使用的框架 (Exposed/SQLDroid) 在不工作时关闭了数据库连接。

因此,即使在应用程序中一切正常时,数据库在数据库检查员想要调查时也已关闭。

添加下面这行基本解决了问题。我不会将它放入生产代码中,因为我还没有详细检查发生了什么,但它在开发过程中有所帮助。

val db = openOrCreateDatabase("testdb.db", MODE_PRIVATE, null)
// db.close() -- DO NOT USE THIS

重要的是不要使用db.close()。当 db.close() 存在时,Database Inspector 将数据库显示为已关闭。当它不存在时,数据库检查器通常可以工作。

实际上调试模式对我不起作用。

它最初有效。突然在一些成功的构建之后,那个问题又来了。所以我所做的是停止检查并打开您实际查询数据库的页面,然后从应用程序检查中附加,它显示数据库一直打开。

None 已发布的解决方案对我有用,直到我 运行 附加了调试器实例的应用程序然后在应用程序加载到模拟器后立即终止了该应用程序。

之后,导航到数据库检查器视图显示必要的数据:

如果您使用的是 Drift flutter 数据库,将 openConnection 函数更改为以下代码可以解决我的问题:

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);
    }
  });
}

请注意,您需要在 pubspec.yaml

中导入 sqflite

我在官方 github 仓库的 Issue 中找到了解决方案: https://github.com/simolus3/drift/discussions/1818

  1. 点击您的关闭数据库图标
  2. 启用(保持打开状态)=>
  3. 做一些与数据库相关的操作(例如获取...的列表)
  4. 数据库保持打开模式