Android – 拉SQlite数据库android设备
我到处寻找,我无法find一个真正的答案或教程如何,如果可能的话,做到这一点。
是否有可能以任何方式拉一个Android设备的数据库,而不必根? 我只是需要以任何方式提取数据,以便将其收集在我的电脑上,那么我该如何执行此操作呢? 我必须重新编程的应用程序或任何你知道的方法,但记住没有根植的设备。 谢谢
实现你想要的一种常用的方法是使用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) { }
不要忘记在清单中设置写在SD上的权限,如下所示。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
如果您的设备运行的是Android v4或更高版本,则可以使用adb backup
命令来提取应用程序数据(包括数据库),然后提取备份文件并访问sqlite数据库。
使用以下命令首先通过USB电缆将备份应用程序数据备份到您的PC,将app.package.name
replace为应用程序的实际软件包名称。
adb backup -f ~/data.ab -noapk app.package.name
这会提示您“解锁设备并确认备份操作”。 不要为备份encryption提供密码 ,以便稍后解压。 点击设备上的“备份我的数据”button。 屏幕将显示您正在备份的软件包的名称,然后在成功完成后自行closures。
您的主文件夹中生成的data.ab
文件包含android备份格式的应用程序数据。 要解压缩它使用以下命令:
dd if=data.ab bs=1 skip=24 | openssl zlib -d | tar -xvf -
如果以上以openssl:Error: 'zlib' is an invalid command.
结束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 -
结果是包含应用程序数据的apps/app.package.name/
文件夹,包括sqlite数据库。
欲了解更多详情,你可以检查原来的博客文章 。
对于无根设备上的可debugging应用程序 1 ,可以使用以下命令:
adb shell run-as package.name chmod 666 /data/data/package.name/databases/file adb pull /data/data/package.name/databases/file
例:
adb shell run-as com.app chmod 666 /data/data/com.app/databases/data.db adb pull /data/data/com.app/databases/data.db
设置环境variablesPATH adb或使用cd命令安卓SDK文件夹platform-tools。
例:
cd /folder/android-sdk/platform-tools/
然后使用上面的命令
1请注意,Play商店中的大多数应用程序都是不可debugging的,因为它需要在清单中设置可debugging标志 。
这里的大多数答案比他们的要复杂得多。 如果您只是想将您的应用程序的数据库从您的手机复制到您的计算机,那么您只需要这个命令:
adb -d shell "run-as your.package.name cat databases/database.name" > target.sqlite
您需要在上面的命令中填写的是应用程序的软件包名称,数据库被调用的内容以及您希望将数据库复制到的位置。
请注意,只有当您只有一台设备连接到您的计算机时,此特定命令才会起作用。 -d
参数表示唯一连接的设备将作为目标。 但是还有其他的参数可以用来代替:
-
-e
将针对唯一正在运行的模拟器 -
-s <serialnumber>
将以具有特定序列号的设备为目标。
如果应用程序在非根设备上以debugging模式运行,则可以使用Android Studio 3.0或更高版本来提取数据库(也包括共享首选项,caching目录等)。
要使用android studio拉数据库,请按照下列步骤操作。
- 单击查看 > 工具窗口 > 设备文件资源pipe理器 。
- 展开/ data / data / [package-name]节点。
对于Ubuntu(不仅?):
请参阅Sergeis Answer,而不是openssl使用zlib-flate:
猫appbackup.ab | (dd bs = 24 count = 0 skip = 1; cat)| zlib-flate -uncompress> appbackup.tar
否则openssl可能会抛出:
openssl:错误:'zlib'是一个无效的命令。
因为openssl在Ubuntu中不支持zlib
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/*"
你可以很容易地从你的设备中提取sqlite文件(根目录没有必要)
- 转到SDK文件夹
- cd平台工具
-
开始adb
cd / sdk / platform-tools ./adb shell
然后在terminal中input以下命令
./adb -d shell“run-as com.your_packagename cat /data/data/com.your_packagename/databases/jokhanaNepal> /sdcard/jokhana.sqlite”
例如
./adb -d shell“run-as com.yuvii.app cat /data/data/com.yuvii.app/databases/jokhanaNepal> /sdcard/jokhana.sqlite”
或者,您可以使用我的Ultra Debugger库。 允许直接在浏览器中将数据库作为文件下载或编辑值。 没有根需要,非常容易使用。
在Mac上(不需要根目录)
1. Go to platform-tools folder. 2) Run following command in terminal. ./adb -d shell "run-as your.package.name cat databases/database.sqlite" > database.sqlite
它将复制平台工具文件夹中的sqlite文件。
> is it possible to pull in any way a database of an Android device without having to root it?
是的,如果你的Android应用程序创build了每个人都可以访问的数据库的文件副本。
android保护应用程序的私人数据,以便其他应用程序不可见/可访问。 一个数据库是私人数据。 您的应用程序当然可以读取数据库文件,以便可以将文件复制到某个公共可见文件。
在植根设备上,您可以:
// check that db is there >adb shell # ls /data/data/app.package.name/databases db_name.sqlite // a custom named db # exit // pull it >adb pull /data/app.package.name/databases/db_name.sqlite
因为,没有什么真的为我工作。 我创build了一个基于其他答案组合在一起的一个小的Windows BATCH脚本。 希望它能帮助别人。 简单使用:backupDatabase <PackageName> <ApplicationName> [TargetDirectory]。 它使用谢尔盖的备份方法和Android备份提取 。
@echo off if [%1]==[] goto usage if [%2]==[] goto usage if NOT [%4]==[] goto usage @echo Processing: preparations set PACKAGE=%1 set APPLICATION_NAME=%2 set TARGET_DIR=%cd% IF NOT "%~3"=="" set TARGET_DIR=%3 set PATH_ADB="c:\Program Files (x86)\Android\android-studio\sdk\platform-tools" set PATH_ABE="c:\Programs\android-backup-extractor-20140630-bin" set PATH_7Z="c:\Program Files\7-Zip" @echo Processing: backup %PATH_ADB%\adb.exe backup -f %TARGET_DIR%\%APPLICATION_NAME%\%APPLICATION_NAME%.ab -noapk %PACKAGE% @echo Processing: unpack java -jar %PATH_ABE%\abe.jar unpack %TARGET_DIR%\%APPLICATION_NAME%\%APPLICATION_NAME%.ab %TARGET_DIR%\%APPLICATION_NAME%\%APPLICATION_NAME%.ab.tar @echo Processing: extract cd %TARGET_DIR%\%APPLICATION_NAME% %PATH_7Z%\7z.exe e %APPLICATION_NAME%.ab.tar "apps\%PACKAGE%\db\%APPLICATION_NAME%" @echo Processing: cleaning del %APPLICATION_NAME%.ab del %APPLICATION_NAME%.ab.tar goto :eof :usage @echo.Pull out SQLite database file from your android device. @echo.Needs: - connected device @echo. - device enable backup. @echo. - application enable backup @echo. - application in debug mode @echo. - installed Android Backup Extractor @echo. - installed command line TAR extractor (7z, ...) @echo.Does NOT need: root device @echo. @echo.Uses: - ADB backup (set PATH_ADB) @echo. - Android Backup Extractor (http://sourceforge.net/projects/adbextractor/) (set PATH_ABE) @echo. - Extract TAR container, uses 7z (set PATH_7Z) @echo. @echo.Usage: backupDatabase ^<PackageName^> ^<ApplicationName^> [TargetDirectory] @echo.Example: backupDatabase com.foo.example ExampleApp @echo Example: backupDatabase com.foo.example ExampleApp workspace\AndroidProjects\Example exit /B 1
根据Lam Vinh给出的答案,这是一个简单的batch file,适用于我的第一代Nexus 7。它会提示用户input软件包名称,然后input数据库名称(不带.sqlite扩展名),并将其放入在c:\ temp中。 这假设你已经在环境variables中设置了Android sdk。
@echo off cd c:\temp\ set /p UserInputPackage= Enter the package name: set /p UserInputDB= Enter the database name: @echo on adb shell "run-as %UserInputPackage% chmod 666 /data/data/%UserInputPackage%/databases/%UserInputDB%.sqlite" adb pull /data/data/%UserInputPackage%/databases/%UserInputDB%.sqlite @echo off pause
如果您使用的是Android 4.0或更高版本,并且位于Mac上 ,那么这是一个ruby脚本,可以将您的应用内容保存到桌面。 我想这也可以在Ubuntu上运行,尽pipe我没有testing它。
puts "enter your package name" package_name = gets.chomp puts "press the 'Back up my data' button on your device" `adb backup -f ~/Desktop/data.ab -noapk #{package_name}` puts "press enter once once the 'Backup finished' toast has appeared" gets.chomp puts "extracting..." `dd if=data.ab bs=1 skip=24 | openssl zlib -d | tar -xvf -`
运行 – > ruby your_ruby_file_name.rb
这个脚本只是“快乐的path”,所以请确保您的设备已连接,并且adb已添加到您的configuration文件中。
这里有一个解决scheme,有关如何通过从Ubuntu 16.04 ssh访问一个没有根4.2的Android手机的文件系统的图片
如何从ubuntu 16.04通过SSH访问一个没有固定的4.2手机的文件系统
如果您正在尝试在Android 6上请求权限并使用此问题的答案的代码
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_RC); return; }
一旦被授予
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == STORAGE_PERMISSION_RC) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { //permission granted start reading or writing database } else { Toast.makeText(this, "No permission to read external storage.", Toast.LENGTH_SHORT).show(); } } }
我给出了完整的解决scheme,将应用程序数据库“保存”和“恢复”到内部存储器(而不是使用adb的PC)。
我已经做了两个方法一个用于保存和其他恢复数据库。 在MainActivity的onCreate()末尾使用这些方法(如果要保存或还原数据库,则使用这两个方法之一)。
将数据库保存到内部存储:
void copyDatabase (){ try { final String inFileName = "/data/data/<pakage.name>/databases/database.db"; final String outFileName = Environment.getExternalStorageDirectory() + "database_backup.db"; File dbFile = new File(inFileName); FileInputStream fis = new FileInputStream(dbFile); Log.d(TAG, "copyDatabase: outFile = " + outFileName); // Open the empty db as the output stream OutputStream output = new FileOutputStream(outFileName); // Transfer bytes from the inputfile to the outputfile byte[] buffer = new byte[1024]; int length; while ((length = fis.read(buffer)) > 0) { output.write(buffer, 0, length); } // Close the streams output.flush(); output.close(); fis.close(); }catch (Exception e){ Log.d(TAG, "copyDatabase: backup error"); } }
从内部存储恢复数据库:
void restoreDatabase (){ try { final String inFileName = Environment.getExternalStorageDirectory() + "database_backup.db"; final String outFileName = "/data/data/<package.name>/databases/database.db"; File dbFile = new File(inFileName); FileInputStream fis = new FileInputStream(dbFile); Log.d(TAG, "copyDatabase: outFile = " + outFileName); // Open the empty db as the output stream OutputStream output = new FileOutputStream(outFileName); // Transfer bytes from the inputfile to the outputfile byte[] buffer = new byte[1024]; int length; while ((length = fis.read(buffer)) > 0) { output.write(buffer, 0, length); } // Close the streams output.flush(); output.close(); fis.close(); }catch (Exception e){ Log.d(TAG, "copyDatabase: backup error"); } }
如果你想要你的数据库文件
请参阅DDMS>文件探索
从包名find你的数据库文件
然后点击从设备中拉出文件(仅限于Rooted设备)