Genymotion。如何从设备中提取数据库。我的/ data / data /文件夹似乎是空的

时间:2013-08-10 22:59:21

标签: android eclipse adb database genymotion

我的ubuntu安装genymotion时遇到问题。主要是我无法调试我的数据库,因为通过eclipse中的DBMS和shell中的adb我无法查看/ data /文件夹的内容。没有显示文件。

我通过cd登录adb到/ sdk / platform-tools并输入./adb shell su。我看到标签不起作用,所以我盲目地输入路径。无论如何我无法拉数据库,也许我做错了命令。

通过DBMS我尝试连接但数据文件夹不显示内容。

在模拟器上一切顺利,但模拟器很慢,我宁愿使用genymotion。

有任何建议如何处理这个问题?

4 个答案:

答案 0 :(得分:11)

我没有你说的问题,Genymotion上的默认shell用户是root,所以不应该发生。尽管如此,您可以使用run-as命令直接访问您的数据。

简而言之。您应用的数据文件夹受应用用户权限的保护。 默认shell用户无权访问应用程序的文件夹。由于run-as命令,您可以更改shell正在使用的用户。

  1. 打开一个shell:adb shell
  2. 然后输入:run-as your.package.name
  3. 此命令会将shell用户更改为您应用的用户。因此,您有权阅读和撰写应用程序的数据。您还将被重定向到应用的数据文件夹:/data/data/you.package.name

    完成后,您可以轻松浏览文件。

    注意:您的应用必须构建为调试才能使用此命令。它应该显示在DDMS上的设备进程列表中。

答案 1 :(得分:7)

在本地计算机上运行模拟器,然后

localuser:~localhost $ adb shell
shell @ android:/ $ su
shell @ android:/ #cp / data / data / your.package.name / databases / your_database.db / mnt / shell / emulated / 0 /下载/ your_database.db
shell @ android:/#exit
shell @ android:/ $ exit
localuser:~localhost $ adb pull / mnt / shell / emulated / 0 /下载/ your_database.db 〜/ your_database.db

它的作用是:
1.连接到仿真器
2.请求超级用户权限
3.将仅对超级用户可用的文件复制到公共目录(在本例中为Downloads) 4.将文件从公用文件夹(下载)拉到本地计算机主目录;你也可以从eclipse gui执行这一步。

答案 2 :(得分:2)

您要设置该文件夹/文件的权限,然后您可以轻松拉动:

  

adb shell“run-as package.name chmod 666 /data/data/package.name/databases/file”

     

adb pull /data/data/package.name/databases/file。

答案 3 :(得分:0)

我设法好好解决这个问题所以我发布我的解决方案以防万一有人会发现它有用。

以前我一直在创建没有谷歌apis的虚拟机,每次我想根电话时,超级用户应用都会崩溃。

所以我创建了随谷歌播放和下载的SQL调试器应用程序提供的VM。我也在我的测试套件中使用这个代码,所以我在运行的每个测试结束时都将db读取到SD卡。这样我就不需要拥有超级用户权限。

public static void copyDbToSd(Context context) {
    File dbFile = context.getDatabasePath((String) DatabaseHandler.DATABASE_NAME);


    InputStream myInput;
    try {
        myInput = new FileInputStream(dbFile);
        OutputStream myOutput = new FileOutputStream(
                Environment.getExternalStorageDirectory() 
                + java.io.File.separator 
                + "database.db");

        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer)) > 0) {
            myOutput.write(buffer, 0, length);
        }

        myOutput.flush();
        myOutput.close();
        myInput.close();
    } catch (FileNotFoundException e) {
        Log.e(TAG, "Exception: ", e);
    } catch (IOException e) {
        Log.e(TAG, "Exception: ", e);
    }

}

其中DatabaseHandler.DATABASE_NAME是我在创建数据库时设置的数据库的名称。