wake-up-neo.com

Debuggen der sqlite-Datenbank auf dem Gerät

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

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

Ich bekomme aber den Fehler "Erlaubnis verweigert". In dieser Antwort Android: Wo werden Datenbankdateien gespeichert? , Commonsware hat vorgeschlagen, Datenbankdateien im Debug-Modus abzurufen. Aber es geht auch nicht. Jede Hilfe, wie Sie die Datenbank debuggen können, ohne das Gerät zu verwurzeln, wäre sehr willkommen.

90

Ich wiederhole mich aus einer anderen Antwort :

Wenn Sie die Anwendung ab API-Ebene 8 (Android 2.2) als debugable erstellen, können Sie mit dem Befehl Shell run-as einen Befehl oder eine ausführbare Datei als bestimmten Benutzer/Anwendung ausführen oder einfach zur UID Ihrer Anwendung wechseln, um darauf zugreifen zu können sein Datenverzeichnis.

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

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

Dies kopiert Ihren db-file in das Stammverzeichnis Ihrer SD-Karte/Ihres externen Speichers. Jetzt können Sie es leicht von dort aus mit dem Dateimanager adb pull oder was auch immer Sie möchten, erhalten. Beachten Sie, dass bei dieser Methode KEINE Berechtigung für Ihre App WRITE_EXTERNAL_STORAGE erforderlich ist, da das Kopieren vom Shell-Benutzer ausgeführt wird, der immer in den externen Speicher schreiben kann.

Auf Linux/Mac-Systemen besteht die Möglichkeit, eine Datenbank mit dem folgenden Befehl, den Sie ohne Eingabe der Adb-Shell verwenden können, direkt auf Ihren Computer zu kopieren:

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

Dies wird jedoch unter Windows wegen der Konvertierung von CR/LF-Symbolen nicht richtig funktionieren. Verwenden Sie die alte Methode dort.

138
Idolon

Ich verwende dieses Shell-Skript auf meinem MAC, der 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
23
Tadas Valaitis

Die beste Möglichkeit, 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 in Ihrer App.

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

Es hat mir sehr geholfen. Hoffentlich hilft es dir auch.

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

14
sanath_p

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 Zitat!

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: Datenbank-Backup auf SD-Karte unter Android erstellen

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

Das Werkzeug, das ich vor kurzem entdeckt habe (und am besten gefällt), ist Android Debug Database .

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.

 enter image description here

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


Das Werkzeug, das ich zuvor verwendet habe, ist stetho .

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

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

5
Peter F

Ich habe einfach gemacht:

$ adb Shell
[email protected]:/ $ run-as myapp.package.name sh
[email protected]:/data/data/myapp.package.name $

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

3
smichak

Es gibt eine Möglichkeit, wenn ein apk fehlerhaft ist, ein Programm namens run-as von der (nicht-root) adb-Shell zu verwenden, um die private Datei einer Anwendung zu kopieren. 

2
Chris Stratton

Hier finden Sie Schritt für Schritt Anweisungen - meistens aus einer Kombination der anderen Antworten. Dies funktioniert bei Geräten, die nicht entsperrt sind.

  1. Verbinden Sie Ihr Gerät und starten Sie die Anwendung im Debug-Modus.

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

    ./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 den Firefox SQLLite Manager und öffnen Sie Ihre Datenbankdatei aus Schritt 3 oben.

  6. Genießen!

2
Andy Cochrane

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

Um adb als root auszuführen, benutze adb root

Siehe auch: Warum bekomme ich bei der Verwendung von adb keinen Zugriff auf den Datenordner?

1
Malfist

Keine der run-as- und cat-to-sdcard-Lösungen funktionierte für mich unter Android 4.4.2. Ich bin nicht sicher, aber ich vermute, dass das run-as-Tool die neuen sdcard_r- und sdcard_rw-Berechtigungen nicht korrekt verarbeitet.

Ich musste zuerst die Datenbankdatei nach /files im privaten internen Speicher meiner Anwendung kopieren: 

[email protected]:/ $ run-as com.example.myapp   
[email protected]:/data/data/com.example.myapp $ cp databases/mydb files/mydb

Dann habe ich in Javaland nach /sdcard/Android/data/com.example.myapp/files kopiert (dies erfordert die WRITE_EXTERNAL_STORAGE-Berechtigung):

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

Zum Schluss habe ich die Datei auf meinen Laptop kopiert:

$ adb pull /sdcard/Android/data/com.example.myapp/files/mydb
1
user167019

Mein Gerät hatte keine SD-Karte 

also die erste lösung hat bei mir nicht funktioniert. 

Wenn Sie ein ähnliches Problem haben, versuchen Sie es wie folgt: 

  adb Shell "run-as package chmod 777 /data/data/package/databases/yourdb.sqlite";
  adb pull /data/data/package/databases/yourdb.sqlite
1
dsharew
  1. Erö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 (funktioniert nur, wenn nur ein Emulator läuft)
  5. cd data/data
  6. su (Superbenutzerrechte erwerben)
  7. cd <PACKAGE_NAME>/databases
  8. sqlite3 <DB_NAME>
  9. sQL-Anweisungen ausgeben ( wichtig: beende sie mit ;, andernfalls wird die Anweisung nicht ausgegeben und bricht in eine neue Zeile auf.)

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

0
Willi Mentzel

Versuchen Sie diese App: SQLiteWeb ( https://play.google.com/store/apps/details?id=br.com.cm.sqliteweb ). Sie ermöglicht den Fernzugriff auf Ihre Datenbank, ohne sie herauszunehmen.

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

Wenn Sie jedoch mit 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);
0
Cesar Morigaki

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

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

  2. füge die Aktion "Shell Script ausführen" hinzu.

  3. Fügen Sie diese ein:

    source ~/.bash_profile adb Shell-Laufkatze /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 dem sqlitebrowser zu aktualisieren.

0
Zaster