如何在没有root的Android设备上检查数据库

时间:2013-07-26 14:03:30

标签: android sqlite adb android-contentprovider android-sqlite

我正在开发一个应用程序,我使用sqllite3数据库来存储值。我有Nexus S和Nexus 7都是无根设备。如何为我的应用程序获取数据库以进行调试。

我试过了 (1)我尝试了所有提到的方法here

adb shell
run-as app.package.name \
cp /data/data/package.name/databases/application.sqlite /sdcard/
exit
adb pull /sdcard/application.sqlite ~/

这说cp没找到..

(2)http://developer.android.com/tools/help/adb.html#sqlite

adb -s emulator-5554 shell
# sqlite3 /data/data/com.example.google.rss.rssexample/databases/rssitems.db
SQLite version 3.3.12
Enter ".help" for instructions
.... enter commands, then quit...
sqlite> .exit 

11 个答案:

答案 0 :(得分:36)

以下解决方案仅适用于可调试的应用。它可能无法在所有设备上正常工作,因为run-as命令在某些设备上不起作用,尤其是对于Jelly Bean。

  1. 创建* .bat文件并复制以下脚本

    adb shell run-as [package] chmod 777 / data / data / [package] / databases /

    adb shell run-as [package] chmod 777 / data / data / [package] / databases / [db_file_name]

    adb shell run-as [package] cp / data / data / [package] / databases / [db_file_name] / sdcard /

    adb pull / sdcard / [db_file_name]

  2. 将[package]更改为所需的应用程序包

  3. 将[db_file_name]更改为所需的数据库名称运行bat文件和 您应该在与bat相同的文件夹中看到复制的数据库 文件

  4. 上述解决方案假定:

    • 您正在使用Windows
    • 设备已连接且可见 “adb devices”

答案 1 :(得分:30)

您可以使用以下内容将数据库写入外部存储器:

private void writeToSD() throws IOException {
    File sd = Environment.getExternalStorageDirectory();

    if (sd.canWrite()) {
        String currentDBPath = DB_NAME;
        String backupDBPath = "backupname.db";
        File currentDB = new File(DB_PATH, 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();
        }
    }
}

其中DB_NAME是我的数据库的名称,DB_PATH的定义如下:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        DB_PATH = context.getFilesDir().getAbsolutePath().replace("files", "databases") + File.separator;
    }
    else {
        DB_PATH = context.getFilesDir().getPath() + context.getPackageName() + "/databases/";
    }

并添加以下权限(感谢@Sathesh指出这一点):

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

我随时编写数据库时调用此方法,以便我最新的数据库文件位于外部存储器中,我可以从那里查看和调试。

然后,您可以使用X-Plore app从Android设备上的外部存储器查看数据库。

答案 2 :(得分:9)

如果你不知道你的应用程序路径,那么你可以使用它:

public void copyAppDbToExternalStorage() throws IOException {
    File sd = Environment.getExternalStorageDirectory();
    File currentDB = getApplicationContext().getDatabasePath("databaseName"); //databaseName=your current application database name, for example "my_data.db"
    if (sd.canWrite()) {
        File backupDB = new File(sd, "toDatabaseName"); // for example "my_data_backup.db"
        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();
        }
    }
}

或者如果您需要将数据库复制到公共“下载”文件夹,那么您可以使用:

public void copyAppDbToDownloadFolder() throws IOException {
    File backupDB = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "toDatabaseName"); // for example "my_data_backup.db"
    File currentDB = getApplicationContext().getDatabasePath("databaseName"); //databaseName=your current application database name, for example "my_data.db"
    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();
    }
}

这在我的Nexus 4设备上完美运行。

答案 3 :(得分:9)

这是一个非常简单明了的答案:(在Android上测试过:无根

adb -d shell 
$ run-as my.package.name
$ cp databases/mydatabase.db /sdcard/mydatabase.db
$ exit
$ exit

现在将您的数据库拉到默认的adb路径

adb -d pull /sdcard/mydatabase.db

或者,例如,您的桌面

adb -d pull /sdcard/mydatabase.db C:\Users\user\Desktop

您可能希望使用以下命令删除副本:

adb -d shell "rm /sdcard/mydatabase.db"
如果有多个模拟器,

-d选项会选择默认设备。

答案 4 :(得分:3)

我只需要做这样的事情并且有办法做到这一点,尽管这很痛苦。您需要将该文件作为应用程序的用户帐户,然后将其传送到可写位置。这对我来说在我的Nexus 4上运行4.3.3:

adb shell "run-as org.your.application cat /data/data/org.your.application/your-file > /mnt/sdcard/your-file"
adb pull /mnt/sdcard/your-file

答案 5 :(得分:2)

尝试使用facebook开发的stetho Library,它可以让你通过网络浏览器查看数据库https://facebook.github.io/stetho/

答案 6 :(得分:0)

a.forEach(function(item){
document.write('<pre> Latitute is '+item.Latitude+'</pre>')
})

在Xamrin.forms中,我不得不将数据库替换为文件

答案 7 :(得分:0)

如果在跑完

之后
adb shell "run-as your.package.name"

您收到&#34; run-as:Package&#39; your.package.name&#39;是未知&#34;,然后尝试从模拟器获取数据库。见这里:https://stackoverflow.com/a/44089632/2914140

在Android Studio 3.0中,点击查看&gt;工具窗口&gt; Device File Explorer。 展开/ data / data / [package-name]节点。

答案 8 :(得分:0)

我认为这是最简单的方法。将此依赖项添加到gradle文件中:debugImplementation'com.amitshekhar.android:debug-db:1.0.0'

此后,当您在控制台中启动应用程序时,您会看到以下消息: D / DebugDB:在浏览器中打开http://192.168.1.114:8080

有您的数据库。

答案 9 :(得分:-2)

您无法访问非根设备上的/ data文件夹

没有办法做到这一点。 Android具有很好的安全机制。只有您的应用可以访问自己的文件。

答案 10 :(得分:-2)

从无根电话无法实现。您无法访问/ data目录,因此您无法复制数据库或使用sqlite app,如(2)所示。如果需要调试,请使用模拟器,或从应用程序运行查询来检查数据库。