在Android API 25之后,设备/模拟器上SQLite db文件的位置是什么?

时间:2017-07-24 18:49:28

标签: java android sqlite android-studio ddms

我有一个android项目,演示如何编写可以在模拟器或设备上执行的android测试用例。作为这些测试用例的结果,数据将填充到设备中,生成的SQLite *.db文件可以从Android Studio的DDMS屏幕下载。

NOTE: 我已在root user shell中尝试adb。我在访问*.db文件时遇到的问题与模拟器中的adbDDMS API 26保持一致。

可以访问代码here

我在AVD Manager中创建了2个模拟器(API 23API 26)。

AVD Manager enter image description here

当我在两个模拟器上运行androidTest时,所有测试用例都成功通过。

使用Android Studio的DDMS ...

  • 在使用API 23的模拟器上,我可以在*.db下查看SQLite /data/data/<package-name>/databases/weather.db文件并将其下载到我的桌​​面并通过http://inloop.github.io/sqlite-viewer/

DDMS enter image description here

ADB Shell enter image description here

  • API 26的模拟器上,/data文件夹是空的?我没有看到与使用*.db的设备访问SQLite API 23文件相同的层次结构。

android app和androidTest都在API 26模拟器上成功运行,这意味着数据保存在android模拟器的某处,但新位置是什么?

DDMS enter image description here

ADB Shell enter image description here

是API 25/26之后的新行为,是否需要特殊权限才能访问DDMSadb shell中的数据?

如果这是新行为,那么位于API 25/26之后的SQLite *.db文件在哪里?

我已经在堆栈溢出和Android文档上搜索了它,但没有发现任何具体的内容,如果我遗漏了任何内容,请告诉我。

2 个答案:

答案 0 :(得分:0)

确保:

1)您正在以 root 用户身份运行 adb

2)您的模拟器应具有 root 访问权限。

链接:How to get root access on Android emulator?

答案 1 :(得分:0)

@jrg我一直在测试如何写入SD卡以及如何找到sqlite数据库的INTERNAL位置的路径以及如何使用Api 26或更高版本查看它。我不确定这会有所帮助,我很想知道一旦生根,可以通过从AVD管理器中删除设备来删除生根

这里有一些可能有帮助的代码

selection.draw

当我在模拟器和真实设备上弹出SD卡时,我使用此代码创建路径

    String state = Environment.getExternalStorageState();

    if (state.equals(Environment.MEDIA_MOUNTED) && (!state.equals(Environment.MEDIA_MOUNTED_READ_ONLY))) {

        File removable = ContextCompat.getExternalFilesDirs(this, null)[1];
        THE_PATH = String.valueOf(removable) + "/Documents/";

        //System.out.println("ALL TRUE ==> " + THE_PATH);

    } else {// if (state.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) {
        THE_PATH = "";
        //System.out.println("ALL FALSE ==> "+ THE_PATH);
    }

我认为Android不允许您在设备上没有文件管理器应用程序的情况下导航到内部存储。您是否考虑过在模拟器上安装文件管理器应用程序。对此我不认为你需要AS 2.4 beta才能做到这一点