Android - 拉动SQlite数据库安卓设备

DeX*_*X03 93 sqlite android

我到处寻找,我找不到真正准确的答案或教程,如果可能的话,如何做到这一点.

是否有可能以任何方式提取Android设备的数据库而无需root用户?我只需要以任何方式提取数据,以便将其收集到我的电脑上,那么我该如何执行此操作呢?我是否需要重新编程应用程序或您知道的任何方法,但请记住,不要使用设备.谢谢

Ser*_*gei 178

如果您的设备运行的是Android V4或以上,你可以拉应用数据,包括它的数据库,而不使用根adb backup命令,然后提取备份文件和访问SQLite数据库.

首先使用以下命令通过USB电缆将应用程序数据备份到PC,替换app.package.name为应用程序的实际软件包名称.

adb backup -f ~/data.ab -noapk app.package.name
Run Code Online (Sandbox Code Playgroud)

这将提示您"解锁设备并确认备份操作".请勿为备份加密提供密码,以便稍后解压缩.单击设备上的"备份我的数据"按钮.屏幕将显示您要备份的软件包的名称,然后在成功完成后自行关闭.

data.ab主文件夹中生成的文件包含android备份格式的应用程序数据.要提取它,请使用以下命令:

dd if=data.ab bs=1 skip=24 | openssl zlib -d | tar -xvf -
Run Code Online (Sandbox Code Playgroud)

如果以上openssl:Error: 'zlib' is an invalid command.错误结束,请尝试以下操作.

dd if=data.ab bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" | tar -xvf -
Run Code Online (Sandbox Code Playgroud)

结果是apps/app.package.name/包含应用程序数据的文件夹,包括sqlite数据库.

有关详细信息,请查看原始博文.

  • 专业提示:如果应用程序的清单显示"android:allowBackup ="false"`,则此备份内容将无效 (12认同)
  • 对于那些没有zlib编译的zlib的人,请查看http://blog.shvetsov.com/2013/02/access-android-app-data-without-root.html上的答案,以便用python提取数据. (9认同)
  • 我在Mac OS X上的`openssl`也不支持`zlib`命令,所以我重新安装了brew:`brew reinstall openssl`.这不会取代您的系统openssl.因此,我仅针对当前会话修改了PATH命令:`export PATH =/usr/local/opt/openssl/bin:$ PATH`,之后可以成功执行此答案中的命令. (9认同)
  • 在我的MacBook Pro上,我收到消息`openssl:错误:'zlib'是一个无效的命令.,我用`dd if = data.ab bs = 1 skip = 24 | python -c"import zlib,sys; sys.stdout.write(zlib.decompress(sys.stdin.read()))"| tar -xvf -`然而,在显示17 + 0条记录中的17 + 0条记录,在0.000064秒内传输了17个字节后,没有证据表明该文件夹已经完成了任何操作.由于它只有17个字节,我认为该命令也失败了.我认为我不能从调试应用程序中"拔出"数据库,这很糟糕! (7认同)
  • 对于unpack命令不可用的Windows用户,可以使用"Android Backup Extractor"Java Application(http://sourceforge.net/projects/adbextractor/).有关解压缩.ab文件的命令,请参见http://forum.xda-developers.com/showthread.php?t=2011811. (2认同)

Kar*_*som 77

实现所需的常用方法是使用ADB pull命令.

在大多数情况下,我更喜欢的另一种方法是通过代码将数据库复制到SD卡:

try {
    File sd = Environment.getExternalStorageDirectory();

    if (sd.canWrite()) {
        String currentDBPath = "/data/data/" + getPackageName() + "/databases/yourdatabasename";
        String backupDBPath = "backupname.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) {

}
Run Code Online (Sandbox Code Playgroud)

不要忘记在清单中设置写入SD的权限,如下所示.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)

  • SQLiteDatabase不是构建数据库路径,而是具有[`getPath`](http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#getPath())方法. (4认同)

小智 68

对于非root设备上的可调试应用程序 1,您可以使用以下命令:

adb shell run-as package.name chmod 666 /data/data/package.name/databases/file
adb pull /data/data/package.name/databases/file
Run Code Online (Sandbox Code Playgroud)

例:

adb shell run-as com.app chmod 666 /data/data/com.app/databases/data.db
adb pull /data/data/com.app/databases/data.db
Run Code Online (Sandbox Code Playgroud)

为环境变量设置PATH adb或使用cd命令到android sdk文件夹platform-tools.

例:

cd /folder/android-sdk/platform-tools/
Run Code Online (Sandbox Code Playgroud)

然后使用上面的命令


1请注意,Play商店中的大多数应用程序都不可调试,因为它需要在清单中设置debuggable标志.

  • 这是Android 5(Lollipop)adb shell的hack"run-as [package_name] chmod -R 777/data/data/[package_name]/databases"adb shell"mkdir -p/sdcard/tempDB"adb shell"cp -r/data/data/[package_name]/databases// sdcard/tempDB /." adb pull sdcard/tempDB /.adb shell"rm -r/sdcard/tempDB/*" (15认同)
  • 用应用程序包替换`package.name`后,返回错误:`run-as:Package'com.my.app'未知` (8认同)
  • 它似乎不适用于所有手机.适用于Nexus 4,例如适用于SGS4. (3认同)
  • 这曾经适合我,但我似乎无法在我的已更新到Android 5的Nexus 7上工作.有人可以确认这适用于Android 5吗? (3认同)
  • db文件保存在哪里? (2认同)

Xav*_*ler 53

这里的大部分答案都比以前更加复杂.如果您只想将应用程序的数据库从手机复制到计算机,那么您只需要以下命令:

adb -d shell "run-as your.package.name cat databases/database.name" > target.sqlite
Run Code Online (Sandbox Code Playgroud)

您需要在上面的命令中填写的是您的应用程序的包名称,数据库的调用内容以及您希望将数据库复制到的位置/位置.

请注意,只有当您的计算机只连接了一台设备时,此特定命令才有效.该-d参数表示将定位唯一连接的设备.但是您可以使用其他参数:

  • -e 将针对唯一正在运行的模拟器
  • -s <serialnumber> 将针对具有特定序列号的设备.


Sha*_*dul 35

如果应用程序在非root设备上以调试模式运行,则可以使用Android Studio 3.0或更高版本来提取数据库(也可以是共享首选项,缓存目录等).

要使用android studio拉数据库,请按照以下步骤操作.

  1. 点击查看 > 工具窗口 > 设备文件浏览器.
  2. 展开/ data/data/[package-name]节点.

Android Studio 3.0中遵循的步骤


Spe*_*sys 6

 adb shell "run-as [package.name] chmod -R 777 /data/data/[package.name]/databases" 
 adb shell "mkdir -p /sdcard/tempDB" 
 adb shell "cp -r /data/data/[package.name]/databases/ /sdcard/tempDB/." 
 adb pull sdcard/tempDB/ . 
 adb shell "rm -r /sdcard/tempDB/*"
Run Code Online (Sandbox Code Playgroud)


Mur*_*mel 5

对于Ubuntu(不仅仅是?):

请参阅Sergeis Answer但不使用openssl使用zlib-flate:

cat appbackup.ab | (dd bs = 24 count = 0 skip = 1; cat)| zlib-flate -uncompress> appbackup.tar

否则openssl可能会抛出:

openssl:错误:'zlib'是一个无效的命令.

因为在Ubuntu中没有使用zlib支持编译openssl