webentwicklung-frage-antwort-db.com.de

So überprüfen Sie die Datenbank auf einem nicht gerooteten Android-Gerät

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 
18
CodingRat

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. 

30
TronicZomB

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. 

  1. 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]

  2. Ändern Sie [package] in das gewünschte Anwendungspaket

  3. Ä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:

  • Sie arbeiten an Windows 
  • Das Gerät ist verbunden und sichtbar unter "Adb devices"
36
kmalmur

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. 

9
kolunar

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.

9
mr.boyfox

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
3
Ted Mielczarek

Versuchen Sie es mit der von Facebook entwickelten stetho Library. Sie können die Datenbank über den Webbrowser anzeigen. https://facebook.github.io/stetho/

2
rAm

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].

0
CoolMind

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.

0
f.trajkovski
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

0
Massimo Alvaro