Ich entwickle eine App, in der ich die sqllite3-Datenbank zum Speichern von Werten verwende. Ich habe Nexus S und Nexus 7, beide sind nicht geworfene Geräte. Wie kann ich die Datenbank für meine App zum Debuggen erhalten?.
Ich habe es ausprobiert. (1) Ich habe alle genannten Ansätze ausprobiert hier
adb Shell
run-as app.package.name \
cp /data/data/package.name/databases/application.sqlite /sdcard/
exit
adb pull /sdcard/application.sqlite ~/
Dies sagt, dass cp nicht gefunden wurde ..
(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
Sie können Ihre Datenbank mit folgendem Befehl in den externen Speicher schreiben:
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();
}
}
}
Dabei ist DB_NAME
der Name meiner Datenbank und DB_PATH
ist wie folgt definiert:
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/";
}
Fügen Sie die folgende Berechtigung hinzu (Danke an @Sathesh für diesen Hinweis):
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
Ich rufe diese Methode immer dann auf, wenn ich eine Datenbank schreibe, sodass sich meine aktuellste Datenbankdatei im externen Speicher befindet und ich sie von dort aus anzeigen und debuggen kann.
Dann können Sie die X-Plore-App verwenden, um die Datenbank vom externen Speicher direkt auf dem Android-Gerät anzuzeigen.
Die folgende Lösung funktioniert nur für Apps, die debuggbar sind. Es funktioniert möglicherweise nicht auf allen Geräten, da der Befehl "Ausführen als" auf einigen Geräten nicht funktioniert, insbesondere mit Jelly Bean.
Erstellen Sie eine * .bat-Datei und kopieren Sie die folgenden Skripts
Adb-Shell Ausführen als [Paket] chmod 777/data/data/[Paket] /datenbanken/
Adb-Shell Ausführen als [Paket] chmod 777/data/data/[Paket] /datenbanken/[Datenbankdateiname]
Adb-Shell Ausführen als [Paket] cp/data/data/[Paket]/database/[Name der Datenbankdatei]/sdcard/
adb pull/sdcard/[db_dateiname]
Ändern Sie [package] in das gewünschte Anwendungspaket
Ändern Sie [db_file_name] in den gewünschten Datenbanknamen. Führen Sie die bat-Datei aus und __. Sie sollten die kopierte Datenbank im selben Ordner wie die bat.__-Datei sehen
Die obige Lösung setzt voraus:
Hier ist eine viel einfache und unkomplizierte Antwort: (Getestet auf Android: Unrooted)
adb -d Shell
$ run-as my.package.name
$ cp databases/mydatabase.db /sdcard/mydatabase.db
$ exit
$ exit
jetzt ziehen Sie Ihre Datenbank auf den Standard-Adb-Pfad
adb -d pull /sdcard/mydatabase.db
oder zu Ihrem Desktop für z.
adb -d pull /sdcard/mydatabase.db C:\Users\user\Desktop
sie können die Kopie mit einem folgenden Befehl entfernen:
adb -d Shell "rm /sdcard/mydatabase.db"
Die Option -d
wählt das Standardgerät aus, wenn mehr als ein Emulator vorhanden ist.
Wenn Sie Ihren Anwendungspfad nicht kennen, können Sie Folgendes verwenden:
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();
}
}
}
Oder wenn Sie die Datenbank in den öffentlichen Ordner "Download" kopieren möchten, können Sie Folgendes verwenden:
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();
}
}
Dies funktioniert perfekt auf meinem Nexus 4-Gerät.
Ich musste einfach so etwas tun und es gibt einen Weg, es zu tun, obwohl es ein Schmerz ist. Sie müssen die Datei als Benutzerkonto der Anwendung definieren und dann an einen beschreibbaren Ort weiterleiten. Dies funktionierte für mich auf meinem Nexus 4 mit 4.3.3:
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
Versuchen Sie es mit der von Facebook entwickelten stetho Library. Sie können die Datenbank über den Webbrowser anzeigen. https://facebook.github.io/stetho/
Wenn nach dem Laufen
adb Shell "run-as your.package.name"
sie erhalten "Ausführen als: Paket 'Ihr.Paket.Name' ist unbekannt", und versuchen Sie, eine Datenbank vom Emulator abzurufen. Siehe hier: https://stackoverflow.com/a/44089632/2914140
Klicken Sie in Android Studio 3.0 auf Ansicht> Tool Windows> Device File Explorer . Erweitern Sie die Knoten/data/data/[Paketname].
Ich denke, das ist der einfachste Weg. Fügen Sie diese Abhängigkeit zu Ihrer Gradle-Datei hinzu: debugImplementation 'com.amitshekhar.Android:debug-db:1.0.0'
Wenn Sie anschließend Ihre Anwendung in Ihrer Konsole starten, sehen Sie die folgende Meldung: D/DebugDB: Öffnen Sie http://192.168.1.114:8080 in Ihrem Browser
Und da ist deine Datenbank.
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/
In Xamarin.forms musste ich Datenbanken in Dateien ersetzen