Sqllite3データベースを使用して値を保存するアプリを開発しています。 Nexus SとNexus 7はどちらもルート化されていないデバイスです。デバッグ目的でアプリのデータベースを取得するにはどうすればよいですか?.
私は試しました(1)私は言及されたすべてのアプローチを試しました ここ
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
次のようにして、データベースを外部メモリに書き込むことができます。
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アプリ を使用して、Androidデバイスの外部メモリからデータベースを表示できます。
次のソリューションは、デバッグ可能なアプリでのみ機能します。一部のデバイス、特にジェリービーンではrun-asコマンドが機能しないため、すべてのデバイスでうまく機能しない可能性があります。
* .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]
[パッケージ]を目的のアプリケーションパッケージに変更します
[db_file_name]を目的のデータベース名に変更します。batファイルを実行すると、コピーされたデータベースがbatファイルと同じフォルダーに表示されます。
上記のソリューションは、次のことを前提としています。
これは非常にシンプルで簡単な答えです:(Android one:nrootedでテスト済み)
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
オプションは、複数のエミュレーターがある場合、デフォルトのデバイスを選択します。
アプリケーションのパスがわからない場合は、これを使用できます。
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デバイスで完全に動作しています。
私はこのようなことをしなければならなかっただけで、それを行う方法はありますが、それは苦痛です。このファイルをアプリケーションのユーザーアカウントとしてcatし、書き込み可能な場所にパイプする必要があります。これは、4.3.3を実行しているNexus 4で私にとってはうまくいきました。
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
Facebookによって開発されたstethoライブラリを使用してみてください。Webブラウザを介してデータベースを表示できます https://facebook.github.io/stetho/
走った後
adb Shell "run-as your.package.name"
「run-as:Package 'your.package.name' is unknown」というメッセージが表示されたら、エミュレータからデータベースを取得してみてください。ここを参照してください: https://stackoverflow.com/a/44089632/291414
Android Studio 3.0で、[表示]> [ツールウィンドウ]> [デバイスファイルエクスプローラ]をクリックします。/data/data/[package-name]ノードを展開します。
これが一番簡単な方法だと思います。この依存関係をGradleファイルに追加します。debugImplementation 'com.amitshekhar.Android:debug-db:1.0.0'
この後、コンソールでアプリケーションを起動すると、次のメッセージが表示されます。D/ DebugDB:Open http://192.168.1.114:808 ブラウザーで
そしてあなたのデータベースがあります。
adb Shell "run-as CHR.Droid chmod 666 /data/data/CHR.Droid/files/CHR.db"
adb Shell cp /data/data/CHR.Droid/files/CHR.db /sdcard/
Xamarin.formsでは、データベースをファイルに置き換える必要がありました