我正在开发一个应用程序,我知道我的数据库*.db将出现在data/data/com.****.***

我可以在sqlite管理器的帮助下从Eclipse中的AVD访问这个文件

但是我的安卓手机无法访问这个文件。 我谷歌了一下,它说我需要在我的手机上查找,但我不想这样做。

我如何访问我的data/data/.....目录在我的安卓手机“没有根它”?

是否可以更改目录data/data.....的用户权限没有生根?


当前回答

您还可以尝试将文件复制到SD卡文件夹,这是一个公共文件夹,然后您可以将文件复制到您的PC上,在那里您可以使用sqlite访问它。

下面是一些你可以用来将文件从data/data复制到公共存储文件夹的代码:

private void copyFile(final Context context) {
    try {
        File sd = Environment.getExternalStorageDirectory();
        File data = Environment.getDataDirectory();

        if (sd.canWrite()) {
            String currentDBPath =
                    context.getDatabasePath(DATABASE_NAME).getAbsolutePath();

            String backupDBPath = "data.db";

            File currentDB = new File(currentDBPath);
            File backupDB = new File(sd, backupDBPath);

            if (currentDB.exists()) {
                FileChannel src = new FileInputStream(currentDB).getChannel();
                FileChannel dst = new FileOutputStream(backupDB).getChannel();
                dst.transferFrom(src, 0, src.size());
                src.close();
                dst.close();
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

清单:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />

其他回答

使用eclipse中的文件资源管理器。Select Windows => Show View => Other…>文件资源管理器。

另一种方法是通过adb提取文件:

adb pull /system/data/data/<yourpackagename>/databases/<databasename> /sdcard

要做到以上任何一项(即从手机本身访问受保护的文件夹),你仍然需要root。(这包括更改/data文件夹的挂载权限并访问它)

如果没有root,除了通过代码从应用程序内部读取外,直接访问/数据是不可能的。所以你可以试着把那个文件复制到sdcard或者其他可以访问的地方,然后,你就可以正常访问它了。

如果您使用的是开发人员设备,那么root不会使您的保修失效。对不起,我没有别的办法了。

在根设备上,正确的解决方案是:

Open cmd
Change your directory and go into 'Platform tools'
Type 'adb shell'
su
Press 'Allow' on device
chmod 777 /data /data/data /data/data/*
Open DDMS view in Eclipse/IntelliJ and from there open 'FileExplorer' to get your desired file

原来的解决方案是可行的,但是chmod将返回未知的目录。将chmod命令更改为/data/data/*可以从Intellij中的DDMS访问data目录中的所有子文件夹。我假设同样的解决方案也适用于Eclipse DDMS。

更新 我的发现很奇怪。我正在IntelliJ (Android设备监视器)中使用DDMS运行Nexus 6。我已经构建了一个小入门应用程序。该应用程序将数据保存到data/data/com.example.myapp/files中的.csv文件

When I first started to try to access this file on my Nexus 6, I found that I have to root the device.. I could see the data folder, but trying to open it would not work. As mentioned online in other places, the expand + would vanish then reappear shortly thereafter (note, there are solutions on the web that claim to allow access to these folders without rooting, I didn't find them till too late, and I'm not sure if I prefer not to root anyway ((I'd rather be able to do it manually than rely on an app or command prompt to give me my solutions))). I rooted my 6 and tried DDMS again.

在这一点上,它显示了数据文件夹,我可以展开文件夹,看到com。目录,但我无法打开任何一个。就在那时,我发现了上面的解决方案。最初的说明对这部分不起作用:

chmod 777 /data /data/data /data/data/com.application.pacakage /data/data/com.application.pacakage/*

就在那时,我尝试了我发布的解决方案:

chmod 777 /data /data/data /data/data/*

这个解决方案似乎是可行的,但只适用于某些文件夹。我现在可以展开myapp文件夹,但不能展开其中的文件目录。

在这一点上,我尝试了一段时间,然后想到为什么不直接在我需要的目录上尝试它,而不是尝试这些通配符条目。

chmod 777 /data /data/data /data/data/com.example.myapp/*

紧随其后的是:

chmod 777 /data /data/data /data/data/com.example.myapp/files

这些命令允许我展开并查看应用程序目录中的文件,以确认.csv文件被正确保存。

希望这能帮助到一些人。我为此挣扎了好几个小时!

(更奇怪的是,权限并没有传递给文件目录的.csv文件。我的文件目录权限读DRWXRWXRWX和我的log.csv文件权限读-rw-rw---- ..仅供参考)

您还可以尝试将文件复制到SD卡文件夹,这是一个公共文件夹,然后您可以将文件复制到您的PC上,在那里您可以使用sqlite访问它。

下面是一些你可以用来将文件从data/data复制到公共存储文件夹的代码:

private void copyFile(final Context context) {
    try {
        File sd = Environment.getExternalStorageDirectory();
        File data = Environment.getDataDirectory();

        if (sd.canWrite()) {
            String currentDBPath =
                    context.getDatabasePath(DATABASE_NAME).getAbsolutePath();

            String backupDBPath = "data.db";

            File currentDB = new File(currentDBPath);
            File backupDB = new File(sd, backupDBPath);

            if (currentDB.exists()) {
                FileChannel src = new FileInputStream(currentDB).getChannel();
                FileChannel dst = new FileOutputStream(backupDB).getChannel();
                dst.transferFrom(src, 0, src.size());
                src.close();
                dst.close();
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

清单:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />

打开命令提示符 将目录改为E:\Android\adt-bundle-windows-x86_64-20140702\adt-bundle-windows-x86_64-20140702\sdk\platform-tools 输入以下命令 Adb -d shell 执行命令-as com.your.packagename cat databases/database.db > /sdcard/database.db 将目录更改为cd /sdcard,确保database.db在那里。 Adb pull /sdcard/database.db或者简单地从设备复制database.db。