Debuggen der SQLite-Datenbank auf dem Gerät

98

Ich arbeite derzeit an einer WiFi-Anwendung für Android. Ich habe Probleme beim Zugriff auf die Datenbank auf dem Gerät. Das Debuggen im Emulator funktioniert bei mir nicht, da der Emulator keine WiFi-Unterstützung bietet. Ich habe versucht, die Datenbankdatei mithilfe von aus dem Gerät zu ziehen

adb pull data/data/package-name/databases/database-name

Aber ich bekomme den Fehler "Berechtigung verweigert". In dieser Antwort Android: Wo werden Datenbankdateien gespeichert? Commonsware hat vorgeschlagen, die Datenbankdatei im Debug-Modus abzurufen. Aber es funktioniert auch nicht. Jede Hilfe zum Debuggen der Datenbank ohne Rooten des Geräts wäre sehr dankbar.

Ursprünglicher Pappachan
quelle

Antworten:

142

Ich werde mich von einer anderen Antwort wiederholen :

Ab API-Ebene 8 (Android 2.2) können Sie, wenn Sie die Anwendung als debuggbar erstellen, mit dem Shell- run-asBefehl einen Befehl oder eine ausführbare Datei als bestimmten Benutzer / eine bestimmte Anwendung ausführen oder einfach zu UIDIhrer Anwendung wechseln, um auf deren Daten zuzugreifen Verzeichnis.

Wenn Sie also Ihre Anwendungsdatenbank vom Gerät abrufen möchten, sollten Sie den Debug-Build der Anwendung adb shellausführen , eine Verbindung mit dem folgenden Befehl herstellen und diesen ausführen:

run-as com.yourpackage sh -c "cat ~/databases/db-file" > /sdcard/db-file.sqlite

Dadurch wird Ihre Datei db-filein das Stammverzeichnis Ihrer SD-Karte / Ihres externen Speichers kopiert . Jetzt können Sie es einfach von dort mit dem Dateimanager adb pulloder was auch immer Sie möchten. Beachten Sie, dass bei diesem Ansatz KEINE WRITE_EXTERNAL_STORAGEBerechtigung für Ihre App erforderlich ist , da das Kopieren vom Shell-Benutzer durchgeführt wird, der jederzeit in den externen Speicher schreiben kann.

Auf Linux / Mac-Systemen besteht die Möglichkeit, eine Datenbank mit dem folgenden Befehl direkt auf Ihren Computer zu kopieren, ohne die adb-Shell aufzurufen:

adb shell 'run-as com.yourpackage sh -c "cat ~/databases/db-file"' > db-file.sqlite

Dies funktioniert jedoch unter Windows aufgrund der Konvertierung von CR / LF-Symbolen nicht richtig. Verwenden Sie dort die erstere Methode.

Idolon
quelle
1
@MikeIsrael Nur für den Fall, dass Sie SQLCipher in Ihrer App nicht verwenden, oder? Wenn nicht, öffnen Sie die DB-Datei in einem Viewer (vorzugsweise einem Hex-Viewer) und prüfen Sie, ob sie mit einer SQLite format 3Zeichenfolge beginnt, um grob zu überprüfen, ob die Datenbank korrekt heruntergeladen wurde . sqliteStellen Sie außerdem sicher, dass Sie eine korrekte Version haben (dh Sie versuchen nicht, die sqlite3-Datenbank mit der ausführbaren Datei sqlite2 zu öffnen). Sie können auch andere SQLite-Clients ausprobieren (z. B. SQLiteStudio ). Ich hoffe es hilft.
Idolon
1
Ich habe Probleme mit dem einen Liner. Es funktioniert gut, wenn ich den Befehl in einer Shell ausführe, aber wenn ich den einen Liner eingebe, den ich bekomme: Das System kann den angegebenen Pfad nicht finden.
Rev. Tyler
2
Paket <mein Paket> ist unbekannt ... jeder weiß warum. Ich habe über Studio durch Drücken der Debug-Taste installiert.
Nathan Schwermann
4
Auf Android Lollipop bekomme ichpermission denied
Muhammad Babar
1
Ich habe eine Datenbank mit zwei Tabellen und jeweils etwa einem Dutzend Zeilen abgerufen und für jede Tabelle vollständige Abfragen ausgewählt. Einer hat gut funktioniert, der andere hat einen Datenfehler in der Datei gemeldet. Meine derzeit beste Vermutung ist eine Codierungsfehlanpassung zwischen Android und lokaler Shell.
Mason
23

Ich verwende dieses Shell-Skript auf meinem MAC, das die Datenbank direkt in meinen Home-Ordner kopiert. Einfache Ein-Klick-Lösung, ändern Sie einfach den Paketnamen (com.example.app) und den Datenbanknamen (database.sqlite).

Einfaches Skript

#!/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 ~/

Skript, das Argumente akzeptiert [Paketname] [Datenbank]

#!/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
Tadas Valaitis
quelle
Der erste Befehl war das Erstellen einer Null-Byte-Kopie der Datenbank, daher habe ich einige Anpassungen in Ihrem Skript vorgenommen: gist.github.com/romulof/6af8a8919660f395f975
romulof
14

Der beste Weg, um Ihre Android-App-Datenbank anzuzeigen und zu verwalten, ist die Verwendung dieser Bibliothek https://github.com/sanathp/DatabaseManager_For_Android

Mit dieser Bibliothek können Sie Ihre App SQLite-Datenbank von Ihrer App selbst aus verwalten. Sie können die Tabellen in Ihrer App-Datenbank anzeigen, aktualisieren, löschen und Zeilen in Ihre Tabellen einfügen. Alles aus Ihrer App.

Es ist eine einzelne Java-Aktivitätsdatei. Fügen Sie die Java-Datei einfach Ihrem Quellordner hinzu. Wenn die Entwicklung abgeschlossen ist, entfernen Sie die Java-Datei aus Ihrem src-Ordner.

Es hat mir sehr geholfen. Ich hoffe, es hilft dir auch.

Sie können die 1-minütige Demo hier ansehen: http://youtu.be/P5vpaGoBlBY

sanath_p
quelle
11

Obwohl es eine alte Frage ist, denke ich, dass sie immer noch relevant ist und eine aktuelle Antwort verdient. Es stehen Tools zur Verfügung, mit denen Sie Datenbanken direkt überprüfen können (ohne sie vom Gerät oder Emulator abrufen zu müssen).

Das Tool, das ich zuletzt entdeckt habe (und das ich am meisten bevorzuge), ist die Android-Debug-Datenbank .

Sie müssen nur diese Abhängigkeit hinzufügen:

debugImplementation 'com.amitshekhar.android:debug-db:1.0.3'

Es ist kein weiterer Code erforderlich. Nachdem Sie Ihre App gestartet haben, öffnen Sie logcat und filtern Sie nach "DebugDB". Daraufhin wird eine Meldung angezeigt

D/DebugDB: Open http://192.168.178.XXX:8080 in your browser

Es funktioniert mit jedem Browser und Sie können Ihre Datenbanktabellen und freigegebenen Einstellungen überprüfen.

Geben Sie hier die Bildbeschreibung ein

Es funktioniert auch mit den Standard- und Genymotion-Emulatoren.


Das Werkzeug, das ich vorher benutzt habe, ist Stetho .

Nachteil: Sie müssen ein wenig Code hinzufügen und sind an den Chrome-Browser gebunden.

Vorteil: Sie haben die Möglichkeit, auch den Netzwerkverkehr zu überprüfen.

Peter F.
quelle
5

In meiner Anwendung exportiere ich die Datenbank auf die SD-Karte. Sobald sich die Datenbank auf der SD-Karte befindet, können Sie darauf zugreifen, indem Sie das Gerät an Ihren Computer anschließen.

Schauen Sie sich diesen Beitrag an: Erstellen einer Datenbanksicherung auf SDCard unter Android

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
quelle
5

Wenn du bekommst

The system cannot find the path specified.

Versuchen

adb -d shell "run-as com.yourpackage cat /data/data/com.yourpackage/databases/dbname.sqlite > /sdcard/dbname.sqlite"

Beachten Sie das doppelte Anführungszeichen!

Gerold Meisinger
quelle
3

Ich habe einfach getan:

$ adb shell
shell@android:/ $ run-as myapp.package.name sh
shell@android:/data/data/myapp.package.name $

Dann kann ich eine SQLite-Datenbank oder was auch immer ich tun möchte, aus einer Shell mit den richtigen Berechtigungen debuggen.

Smichak
quelle
2

Es gibt eine Möglichkeit, wenn ein apk debuggbar ist, ein Programm namens run-as aus der (Nicht-Root-) ADB-Shell zu verwenden, um die private Datei einer Anwendung zu kopieren.

Chris Stratton
quelle
2

Hier finden Sie schrittweise Anleitungen - meist aus einer Kombination der anderen Antworten. Dies funktioniert mit Geräten, die nicht entsperrt sind.

  1. Schließen Sie Ihr Gerät an und starten Sie die Anwendung im Debug-Modus.

  2. Kopieren Sie die Datenbankdatei aus Ihrem Anwendungsordner auf Ihre SD-Karte: Ausführen:

    ./adb -d shell 'run-as com.yourpackge.name cat /data/data/com.yourpackge.name/databases/filename.sqlite> /sdcard/filename.sqlite'

  3. Ziehen Sie die Datenbankdateien auf Ihren Computer: Führen Sie Folgendes aus:

    ./adb pull / sdcard / execute: ./adb

  4. Installieren Sie Firefox SQLLite Manager: https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/

  5. Öffnen Sie Firefox SQLLite Manager und öffnen Sie Ihre Datenbankdatei ab Schritt 3 oben.

  6. Genießen!

Andy Cochrane
quelle
2

Android Studio 4.1 Es wurde eine neue Funktion zum Anzeigen / Bearbeiten von Android SQLite-Datenbanken hinzugefügt.

Geben Sie hier die Bildbeschreibung ein

So öffnen Sie den Datenbankinspektor

Um den Datenbankinspektor in Android Studio zu öffnen, müssen Sie View > Tool Windows > Database Inspectoraus der Menüleiste auswählen .

Außerdem müssen Sie die App auf einem Gerät ausführen, auf dem API-Level 26 oder höher ausgeführt wird.

Mit diesem Tool können Sie

  • Fragen Sie Ihre Datenbanken ab

  • Ändern und debuggen Sie Ihre Datenbank

Geben Sie hier die Bildbeschreibung ein

Darish
quelle
2

Im neuen Android Studio 4.1 gibt es den neuen Database Inspector .

https://developer.android.com/studio/preview/features/images/database-inspector.gif

Sie können die folgenden Optionen aus der Menüleiste auswählen View > Tool Windows > Database Inspector, um sie zu öffnen. Nähere Anweisungen finden Sie in diesem Blog .

Eine andere Möglichkeit besteht darin, Stetho dafür zu verwenden. Sie fügen die Abhängigkeit hinzu und können dann die Chrome DevTools (chrome: // inspect) verwenden, um die Datenbank zu überprüfen, wenn das Gerät angeschlossen ist.

Jeprubio
quelle
1

Sie müssen adb als root ausführen oder auf einem gerooteten Telefon verwenden.

Verwenden Sie, um adb als root auszuführen adb root

Siehe auch: Warum wird mir bei Verwendung von adb der Zugriff auf den Datenordner verweigert?

Malfist
quelle
Ich hatte es versucht. Aber es gibt mir "adb kann nicht als root in Produktions-Builds ausgeführt werden"
Primal Pappachan
Sie müssen es im Debug-Modus ausführen.
Malfist
Siehe dies: mydroidworld.com/forums/android-hacks/… Wenn Sie es auf einem Telefon und nicht auf einem Emulator ausführen, müssen Sie es rooten .
Malfist
Ich habe die Anwendung im Debug-Modus ausgeführt und auch die obigen Schritte ausgeführt. Es funktioniert nicht.
Primal Pappachan
Dies funktioniert nur für den Emulator oder ein gerootetes Gerät.
Slott
1

Keine der run-as-and-cat-to-sdcard-Lösungen funktionierte für mich unter Android 4.4.2. Ich bin mir nicht sicher, aber ich vermute, dass dies daran liegt, dass das run-asTool die neuen sdcard_rund sdcard_rwBerechtigungen nicht richtig verarbeitet .

Ich musste zuerst die Datenbankdatei /filesin den privaten internen Speicher meiner Anwendung kopieren :

shell@hammerhead:/ $ run-as com.example.myapp   
shell@hammerhead:/data/data/com.example.myapp $ cp databases/mydb files/mydb

Dann habe ich /sdcard/Android/data/com.example.myapp/filesin Javaland kopiert (dies erfordert die WRITE_EXTERNAL_STORAGEErlaubnis):

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);
     }
 }

Schließlich habe ich die Datei auf meinen Laptop kopiert:

$ adb pull /sdcard/Android/data/com.example.myapp/files/mydb
user167019
quelle
1
Es gibt eine einfachere Lösung. Wenn Sie Ihre SQLite-Datei chmod 777 und dann run-as beenden, können Sie sie als regulären Benutzer auf / sdcard kopieren.
Zedix
1

Mein Gerät hatte keine SD-Karte

Die erste Lösung hat bei mir also nicht funktioniert.

Wenn Sie ein ähnliches Problem haben, versuchen Sie Folgendes:

  adb shell "run-as package chmod 777 /data/data/package/databases/yourdb.sqlite";
  adb pull /data/data/package/databases/yourdb.sqlite
dsharew
quelle
/sdcardist nicht unbedingt eine SD-Karte. Auf meinem Telefon zeigt es auf internen Speicher, wenn keine physische SD-Karte vorhanden ist.
DearVolt
0

Probieren Sie diese App aus: SQLiteWeb ( https://play.google.com/store/apps/details?id=br.com.cm.sqliteweb ). Es bietet Remotezugriff auf Ihre Datenbank, ohne sie herauszuziehen.

In der kostenpflichtigen Version hat es Root-Zugriff für die private Datenbank (/ data / data / package-name ...) oder implementiert einen Inhaltsanbieter, um eine Verbindung mit SQLiteWeb herzustellen (Anweisungen in der App).

Wenn Sie jedoch bei der kostenlosen Version bleiben möchten, können Sie Ihre Datenbank in einem externen Speicher erstellen:

database = SQLiteDatabase.openDatabase(Environment.getExternalStorageDirectory()
        + "/" + DATABASE_NAME, null, DATABASE_VERSION);
Cesar Morigaki
quelle
0

Verwenden Sie unter OSX die Antwort von @Tadas mit Automator und sqllitebrowser ( https://github.com/sqlitebrowser/sqlitebrowser ):

  1. Öffnen Sie Automator und erstellen Sie einen neuen Workflow.

  2. Fügen Sie die Aktion "Shell-Skript ausführen" hinzu.

  3. Fügen Sie Folgendes ein:

    source ~ / .bash_profile adb shell 'run-as cat /data/data/your_app_uid/databases/db.name> /tmp/db.name' adb pull /tmp/db.name ~ / open -a sqlitebrowser ~ / db. Name

  4. Klicken Sie auf Ausführen, um die Datenbank auf sqlitebrowser zu aktualisieren.

Zaster
quelle
0
  1. Öffnen Sie ein Terminal
  2. cd <ANDROID_SDK_PATH>(für mich unter Windows cd C:\Users\Willi\AppData\Local\Android\sdk)
  3. cd platform-tools
  4. adb shell (Dies funktioniert nur, wenn nur ein Emulator ausgeführt wird.)
  5. cd data/data
  6. su (Superuser-Berechtigungen erhalten)
  7. cd <PACKAGE_NAME>/databases
  8. sqlite3 <DB_NAME>
  9. SQL-Anweisungen ausgeben ( wichtig: Beenden Sie sie mit ;, andernfalls wird die Anweisung nicht ausgegeben und bricht stattdessen in eine neue Zeile ein.)

Hinweis: Verwenden Sie ls(Linux) oder dir(Windows), wenn Sie Verzeichnisinhalte auflisten müssen.

Willi Mentzel
quelle