我目前正在开发适用于Android的WiFi应用程序。我在尝试访问设备上的数据库时遇到问题。模拟器中的调试对我不起作用,因为模拟器中没有WiFi支持。我尝试使用
将数据库文件拉出设备adb pull data/data/package-name/databases/database-name
但我收到错误“Permission denied。”。 在这个答案Android: Where are database files stored?中,Commonsware建议通过在调试模式下运行来提取数据库文件。但它也不起作用。任何有关如何在不使设备生根的情况下调试数据库的帮助将不胜感激。
答案 0 :(得分:138)
我将从another answer重复一遍:
从API级别8(Android 2.2)开始,如果您将应用程序构建为可调试的,则可以使用shell
run-as
命令以特定用户/应用程序的身份运行命令或可执行文件,或者只切换到{应用程序的{1}},以便您可以访问其数据目录。
因此,如果您希望从设备中提取应用程序数据库,则应运行应用程序的调试版本,连接UID
并运行以下命令:
adb shell
这会将您的run-as com.yourpackage sh -c "cat ~/databases/db-file" > /sdcard/db-file.sqlite
复制到SD卡/外部存储设备的根目录。现在,您可以使用文件管理器db-file
或其他任何您喜欢的内容轻松地从中获取它。请注意,使用此方法,您的应用程序不需要adb pull
权限,因为复制由shell用户完成,该用户始终可以写入外部存储。
在Linux / Mac系统上,可以使用以下命令将数据库直接复制到您的计算机,无需输入adb shell即可使用该命令:
WRITE_EXTERNAL_STORAGE
但由于CR / LF符号转换,这在Windows上无法正常工作。在那里使用前一种方法。
答案 1 :(得分:23)
我在我的MAC上使用这个shell脚本,它将数据库直接复制到我的主文件夹。轻松一键解决方案,只需更改包名称(com.example.app)和数据库名称(database.sqlite)
简单脚本
#!/bin/bash
adb -d shell 'run-as com.example.app cat /data/data/com.example.app/databases/database.sqlite > /sdcard/database.sqlite'
adb pull /sdcard/database.sqlite ~/
接受参数[package_name] [database]
的脚本#!/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
答案 2 :(得分:14)
查看和管理Android应用数据库的最佳方法是使用此库https://github.com/sanathp/DatabaseManager_For_Android
使用此库,您可以从应用程序本身管理您的应用程序SQLite数据库。 您可以在应用数据库中查看表格,更新,删除,在表格中插入行。从您的应用中获取所有内容。
它是一个单独的java活动文件,只需将java文件添加到源文件夹中。当开发完成后,从你的src文件夹中删除java文件。
它给了我很多帮助。希望它也可以帮到你。
您可以在此处查看1分钟演示:http://youtu.be/P5vpaGoBlBY
答案 3 :(得分:6)
虽然,这是一个老问题,我认为它仍然相关,值得当前的州回答。有一些工具可供您直接检查数据库(无需从设备或模拟器中提取数据库)。
我最近发现(并且最受青睐)的工具是Android Debug Database。
您只需要添加此依赖项:
debugImplementation 'com.amitshekhar.android:debug-db:1.0.3'
无需其他代码。 启动应用程序后,打开logcat并过滤“DebugDB”,您将看到一条消息
D/DebugDB: Open http://192.168.178.XXX:8080 in your browser
它适用于每个浏览器,您可以检查数据库表和共享首选项。
它也适用于默认和Genymotion模拟器。
我之前使用的工具是stetho。
下行:您需要添加一些代码,然后才能使用Chrome浏览器。
优势:您还可以选择检查网络流量。
答案 4 :(得分:5)
在我的应用程序中,我将数据库导出到SD卡。一旦数据库在SD卡上,就可以通过将设备插入计算机来访问它。
答案 5 :(得分:5)
如果你得到
The system cannot find the path specified.
试
adb -d shell "run-as com.yourpackage cat /data/data/com.yourpackage/databases/dbname.sqlite > /sdcard/dbname.sqlite"
注意双引号!
答案 6 :(得分:4)
在新的 Android Studio 4.1 中,有新的Database Inspector。
您可以从菜单栏View > Tool Windows > Database Inspector
中选择以下选项以将其打开(在Android Studio 4.2中为App Inspector
)。可以在this blog和Exploring the Database Inspector in Android Studio的中篇文章中找到更详细的说明。
另一种方法是使用stetho。添加依赖项后,可以在插入设备后使用Chrome DevTools(chrome:// inspect)检查数据库。
答案 7 :(得分:3)
我只是这样做了:
$ adb shell
shell@android:/ $ run-as myapp.package.name sh
shell@android:/data/data/myapp.package.name $
然后我可以使用正确的权限调试sqlite数据库或我想做的任何事情。
答案 8 :(得分:2)
这是一步一步的说明 - 主要来自其他答案的组合。这适用于未解锁的设备。
连接您的设备并以调试模式启动应用程序。
将数据库文件从应用程序文件夹复制到SD卡:执行:
./ adb -d shell'run-as com.yourpackge.name cat /data/data/com.yourpackge.name/databases/filename.sqlite> /sdcard/filename.sqlite'
将数据库文件拉到您的机器上:执行:
./ adb pull / sdcard / execute:./ adb
安装Firefox SQLLite Manager:https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/
打开Firefox SQLLite Manager并从上面的步骤3打开您的数据库文件。
享受!
答案 9 :(得分:2)
如果apk是可调试的,有一种方法可以使用名为run-as的程序从(非root)adb shell复制应用程序的私有文件。
答案 10 :(得分:2)
Android Studio 4.1 添加了用于查看/编辑Android SQLite数据库的新功能。
要在Android Studio中打开数据库检查器,您需要从菜单栏中选择View > Tool Windows > Database Inspector
。
还需要在运行API级别26或更高级别的设备上运行该应用程序。
使用此工具,您可以
查询数据库
修改和调试数据库
答案 11 :(得分:1)
在Android 4.4.2上,run-as
- 和 - cat-to-sdcard解决方案都不适用于我。我不确定,但我怀疑这可能是因为run-as
工具无法正确处理新的sdcard_r
和sdcard_rw
权限。
我首先必须将数据库文件复制到我应用程序的私有内部存储中的/files
:
shell@hammerhead:/ $ run-as com.example.myapp
shell@hammerhead:/data/data/com.example.myapp $ cp databases/mydb files/mydb
然后我在Javaland中复制到/sdcard/Android/data/com.example.myapp/files
(这需要WRITE_EXTERNAL_STORAGE
权限):
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
...
if (isExternalStorageWritable()) {
final FileInputStream input;
try {
input = openFileInput("mydb");
File output = new File(getExternalFilesDir(null), "mydb");
copy(input, output);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void copy(FileInputStream in, File dst) throws IOException {
OutputStream out = new FileOutputStream(dst);
// Transfer bytes from in to out
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
}
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
return Environment.MEDIA_MOUNTED.equals(state);
}
}
最后,我将文件复制到我的笔记本电脑:
$ adb pull /sdcard/Android/data/com.example.myapp/files/mydb
答案 12 :(得分:1)
如果您遇到类似问题,请尝试以下方法:
adb shell "run-as package chmod 777 /data/data/package/databases/yourdb.sqlite";
adb pull /data/data/package/databases/yourdb.sqlite
答案 13 :(得分:1)
您需要以root用户身份运行adb,或者在root手机上使用它。
要以root用户身份运行adb,请使用adb root
另请参阅:Why do I get access denied to data folder when using adb?
答案 14 :(得分:0)
试试这个应用程序:SQLiteWeb(https://play.google.com/store/apps/details?id=br.com.cm.sqliteweb)。它提供了对数据库的远程访问,而无需将其删除。
在付费版本中,它具有私有数据库的root访问权限(/ data / data / package-name ...)或使用SQLiteWeb实现Content Provider连接(app中的指令)
但是如果想要使用免费版本,可以在外部存储中创建数据库:
database = SQLiteDatabase.openDatabase(Environment.getExternalStorageDirectory()
+ "/" + DATABASE_NAME, null, DATABASE_VERSION);
答案 15 :(得分:0)
在OSX上,使用@Tadas回答automator和sqllitebrowser(https://github.com/sqlitebrowser/sqlitebrowser):
打开Automator并创建新的工作流程。
添加"运行Shell脚本"动作。
粘贴:
source~ / .bash_profile adb shell' run-as cat /data/data/your_app_uid/databases/db.name> /tmp/db.name' adb pull /tmp/db.name~ / 打开-a sqlitebrowser~ / db.name
单击“运行”以刷新sqlitebrowser上的数据库。
答案 16 :(得分:0)
func ListenerButton(number int, button *ui.Button, conn io.Writer) string {
// ...
}
ListenerButton(number, button, io.MultiWriter(os.Stderr, networkConn))
(适用于Windows cd <ANDROID_SDK_PATH>
)cd C:\Users\Willi\AppData\Local\Android\sdk
cd platform-tools
(仅当一个模拟器正在运行时才有效)adb shell
cd data/data
(获得超级用户权限)su
cd <PACKAGE_NAME>/databases
sqlite3 <DB_NAME>
终止它们,否则不会发出该语句而是会中断到新行。)注意:如果需要列出目录内容,请使用;
(Linux)或ls
(Windows)。