Android Studio 数据库检查器始终显示数据库为“关闭”

45

我正在尝试在Android Studio中使用数据库检查器。当我在设备上运行应用程序时,它的检查器始终将我的应用程序数据库(在图像中突出显示)显示为“关闭”。

这个问题有解决方法吗?还是在设置期间我错过了什么?

输入图像描述


1
https://github.com/amitshekhariitbhu/Android-Debug-Database 是一个很好的数据库检查器替代方案。 - James121
21个回答

21

更新:上次我遇到了这个烦人的问题,清除缓存/重启对我有用。

在调试模式下运行应用程序输入图像描述(Win: Shift+F9或Mac: Control+D),有时会为我解决问题。

不确定这是否是一个 bug。Android 文档没有提到这一点,所以我想它应该在普通模式下工作,但由于某种原因对我来说并没有起作用。

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

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

切换开关 '保持数据库连接打开' 似乎也没有帮助。

在普通模式下:

输入图像描述

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

输入图像描述

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

输入图像描述


1
我尝试了上述步骤,但没有起作用。我清除了应用程序缓存和数据,并重新启动了应用程序,然后它开始工作了。 - Zahid Ali
1
有趣的是,在我的情况下,问题是数据库太大了(15+ GB),一旦我清理了它 - 这个检查功能就像预期的那样开始工作。 - konnovdev
清除缓存+重启+卸载应用=没有起作用。但在连接“应用检查”之前,在数据库上执行简单的选择可能有所帮助。不确定;] - Grzegorz Dev
清除缓存/重新启动 对我起了作用 - Leonardo Sibela
清除缓存/重新启动 对我来说起作用了 - undefined

19

我遇到了同样的问题,尝试了很多方法但都没有奏效,最终在一天之后才发现了问题。

问题就在于我使用了加密的SQLite数据库(自定义的 openHelperFactory)。

对我来说,删除 openHelperFactory 之后问题就解决了。

它完美地解决了我的问题,也许对你没有用,但肯定会对其他人有用。

谢谢!


相关问题 https://issuetracker.google.com/issues/153684328 - arekolek
这个 openHelperFactory 还没有支持吗? - Kakaranara

13
  1. 点击关闭数据库图标
  2. 启用(保持打开) => enter image description here
  3. 执行与数据库相关的操作(例如获取一个列表...)
  4. 数据库仍处于打开状态

6

我认为“closed”的原因很可能是我使用的框架(Exposed/SQLDroid)在数据库连接不起作用时会关闭连接。

所以,即使应用程序一切正常运行,当Database Inspector想要查看它时,数据库也会关闭。

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

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

重要的是不要使用db.close()。当有db.close()时,数据库检查器会显示数据库已关闭。当没有它时,数据库检查器通常可以正常工作。


3

在我运行应用程序时附加了调试器实例并在模拟器加载完应用程序后立即终止应用程序之前,没有发布的解决方案对我起作用。

之后,转到“数据库检查器”视图即可显示必要的数据: enter image description here


当我看到列表中的此问题时,本来打算回答它。已投上我的赞成票。 - John T

3
在我的情况下,我正在使用SQLite数据库。 我只是注释了这一行: //yourDatabaseName.close(); 然后再次运行并希望它能正常工作。 完成后不要忘记取消注释这一行。

2

启用“保持数据库连接打开”。如下图所示:

Database View


1
如果您正在使用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 存储库的问题中找到了解决方案: https://github.com/simolus3/drift/discussions/1818

1
有时数据库会自动关闭,需要强制打开数据库。
if (instance == null) {
        instance = Room.databaseBuilder(
                context,
                TheDatabase.class,
                DATABASE_NAME
        )
                .addCallback(callback)
                .allowMainThreadQueries()
                .build();
    }
    instance.getOpenHelper().getWritableDatabase(); //<<<<< FORCE OPEN
    return instance;

1
不确定这是否有帮助,但是您可能选择了错误的模拟器/设备来使用数据库检查器。 enter image description here 您可以按照图像所示点击模拟器名称更改数据库检查器的模拟器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接