【发布时间】:2010-12-03 09:48:12
【问题描述】:
我正在开发一个将数据存储在 SQLite 数据库中的 Android 应用程序。我的问题是,当您使用模拟器时,这个数据库文件存储在文件系统的什么位置?
我已经看到它存储在
/data/data/package_name/databases
但我需要知道我的本地计算机硬盘上实际映射到的位置。即使在关闭机器之后,数据库也会在模拟器的多次运行中持续存在,因此它不能只驻留在 RAM 中......
【问题讨论】:
我正在开发一个将数据存储在 SQLite 数据库中的 Android 应用程序。我的问题是,当您使用模拟器时,这个数据库文件存储在文件系统的什么位置?
我已经看到它存储在
/data/data/package_name/databases
但我需要知道我的本地计算机硬盘上实际映射到的位置。即使在关闭机器之后,数据库也会在模拟器的多次运行中持续存在,因此它不能只驻留在 RAM 中......
【问题讨论】:
以下 cmets 中提到的更新:
您不再需要在 DDMS 透视图中,只需从 Eclipse 打开文件资源管理器 Window > Show View > Other... 似乎不需要运行该应用程序甚至,我可以浏览不同的应用程序文件内容。我是 运行 ADB 1.0.29 版
或者,您可以尝试旧方法:
在 Eclipse IDE 上打开 DDMS 透视图
(窗口 > 打开透视图 > 其他 > DDMS)
最重要的是:
您的应用程序必须正在运行,这样您才能看到文件夹和文件的层次结构。
然后在文件资源管理器标签中,您将按照路径:
数据 > 数据 > 你的包名 > 数据库 > 你的数据库文件。
然后选择文件,点击屏幕右上角的磁盘图标下载.db文件。如果您想将数据库文件上传到模拟器,您可以点击电话图标(在磁盘图标旁边),然后选择要上传的文件。
如果你想查看.db文件的内容,我建议你使用SQLite数据库浏览器,你可以下载here。
PS:如果你想在真实设备上查看数据库,你必须root你的手机。
【讨论】:
Failed to pull selection(null)
模拟器的文件系统没有映射到硬盘上的目录。模拟器的磁盘映像存储为映像文件,您可以通过 Eclipse(在工具栏中查找 G1 外观的图标)或通过模拟器二进制文件本身(运行“emulator -help”获取选项描述)来管理它.
您最好从命令行使用 adb 插入正在运行的模拟器。如果您可以获得特定的目录和文件名,您可以执行“adb pull”以将数据库文件从模拟器中取出并放到您的常规硬盘上。
编辑:删除了这也适用于无根设备的建议 - 它仅适用于模拟器以及您以 root 身份运行 adb 的设备。
【讨论】:
adb pull(即使使用 exact 路径!) .
adb pull /data/data/com.activeandroid.test/databases/Application.db ~/Development/Application.db
【讨论】:
在 Android Studio 3.4.1 中,您可以使用 Android Studio 的搜索功能找到“设备文件资源管理器”,然后进入模拟器的 /data/data/package_name/database 目录。
【讨论】:
我写了一个简单的 bash 脚本,它将数据库从 android 设备拉到你的计算机(Linux、Mac 用户)
文件名:android_db_move.sh 用法:android_db_move.sh com.example.app db_name.db
#!/bin/bash
REQUIRED_ARGS=2
ADB_PATH=/Users/Tadas/Library/sdk/platform-tools/adb
PULL_DIR="~/"
if [ $# -ne $REQUIRED_ARGS ]
then
echo ""
echo "Usage:"
echo "android_db_move.sh [package_name] [db_name]"
echo "eg. android_db_move.sh lt.appcamp.impuls impuls.db"
echo ""
exit 1
fi;
echo""
cmd1="$ADB_PATH -d shell 'run-as $1 cat /data/data/$1/databases/$2 > /sdcard/$2' "
cmd2="$ADB_PATH pull /sdcard/$2 $PULL_DIR"
echo $cmd1
eval $cmd1
if [ $? -eq 0 ]
then
echo ".........OK"
fi;
echo $cmd2
eval $cmd2
if [ $? -eq 0 ]
then
echo ".........OK"
fi;
exit 0
【讨论】:
数据库以 SQLite 文件的形式存储在 /data/data/PACKAGE/databases/DATABASEFILE 中,其中:
您可以在模拟器的“文件资源管理器”选项卡中选择DDMS 透视图,查看(从/复制到文件系统)数据库文件。
【讨论】:
1查看当前可用的设备/模拟器列表。
$ adb devices
附加设备列表
G7NZCJ015313309 device emulator-5554 device
9885b6454e46383744 设备
2 在您的设备/模拟器上运行备份
$ adb -s emulator-5554 backup -f ~/Desktop/data.ab -noapk com.your_app_package.app;
3 提取数据.ab
$ dd if=data.ab bs=1 skip=24 | openssl zlib -d | tar -xvf -;
您将在/db 文件夹中找到数据库
【讨论】:
$ dd if=data.ab bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" | tar -xvf -
bash: adb: command not found
根据Android docs,Monitor 在 Android Studio 3.1 中已弃用,并从 Android Studio 3.2 中删除。要访问文件,在 android studio 中有一个名为“设备文件资源管理器”的选项卡,位于开发窗口的右下方,您可以访问您的模拟器文件系统。只需关注
/data/data/package_name/数据库
祝你好运。
【讨论】:
对于 Android Studio 3.5,请使用此处的说明找到它:https://developer.android.com/studio/debug/device-file-explorer (查看 -> 工具窗口 -> 设备文件资源管理器 -> -> 数据库
【讨论】: