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.
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 zurUID
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.
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
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
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!
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.
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.
Ich habe einfach gemacht:
$ adb Shell
[email protected]:/ $ run-as myapp.package.name sh
She[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.
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.
Hier finden Sie Schritt für Schritt Anweisungen - meistens aus einer Kombination der anderen Antworten. Dies funktioniert bei Geräten, die nicht entsperrt sind.
Verbinden Sie Ihr Gerät und starten Sie die Anwendung im Debug-Modus.
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'
Ziehen Sie die Datenbankdateien auf Ihren Computer: Führen Sie Folgendes aus:
./adb pull/sdcard/execute: ./adb
Installieren Sie Firefox SQLLite Manager: https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/
Öffnen Sie den Firefox SQLLite Manager und öffnen Sie Ihre Datenbankdatei aus Schritt 3 oben.
Genießen!
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?
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
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
cd <Android_SDK_PATH>
(für mich unter Windows cd C:\Users\Willi\AppData\Local\Android\sdk
)cd platform-tools
adb Shell
(funktioniert nur, wenn nur ein Emulator läuft)cd data/data
su
(Superbenutzerrechte erwerben)cd <PACKAGE_NAME>/databases
sqlite3 <DB_NAME>
;
, 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.
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);
Verwenden Sie unter OSX @Tadas answer mit Automator und sqllitebrowser ( https://github.com/sqlitebrowser/sqlitebrowser ):
Öffnen Sie Automator und erstellen Sie einen neuen Workflow.
füge die Aktion "Shell Script ausführen" hinzu.
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
klicken Sie auf Ausführen, um die Datenbank auf dem sqlitebrowser zu aktualisieren.