Debug del database sqlite sul dispositivo


98

Attualmente sto lavorando a un'applicazione WiFi per Android. Ho problemi nel tentativo di accedere al database sul dispositivo. Il debug nell'emulatore non funziona per me, perché non c'è supporto WiFi nell'emulatore. Ho provato a estrarre il file di database dal dispositivo utilizzando

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

Ma ricevo l'errore "Autorizzazione negata". In questa risposta Android: dove vengono archiviati i file di database? , Commonsware ha suggerito di eseguire il pull del file di database eseguendolo in modalità di debug. Ma non funziona neanche. Qualsiasi aiuto su come eseguire il debug del database senza eseguire il root del dispositivo sarebbe molto apprezzato.

Risposte:


142

Mi ripeterò da un'altra risposta :

A partire dal livello API 8 (Android 2.2), se costruisci l'applicazione come debuggabile, puoi utilizzare il run-ascomando shell per eseguire un comando o eseguibile come un utente / applicazione specifico o semplicemente passare al UIDdella tua applicazione in modo da poter accedere ai suoi dati directory.

Quindi, se desideri estrarre il database dell'applicazione dal dispositivo, dovresti eseguire la build di debug dell'applicazione, connetterti adb shelled eseguire il seguente comando:

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

Questo copierà il tuo db-filenella directory principale della tua scheda SD / memoria esterna. Ora puoi ottenerlo facilmente da lì utilizzando il file manager adb pullo qualsiasi altra cosa ti piaccia. Tieni presente che con questo approccio NON è necessario che la tua app abbia l' WRITE_EXTERNAL_STORAGEautorizzazione, poiché la copia viene eseguita dall'utente della shell che può sempre scrivere nella memoria esterna.

Su sistemi Linux / Mac c'è la possibilità di copiare un database direttamente sul tuo computer con il seguente comando che puoi usare senza entrare nella shell adb:

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

Ciò tuttavia non funzionerà correttamente su Windows a causa della conversione dei simboli CR / LF. Usa il primo metodo lì.


1
@MikeIsrael Per ogni evenienza, non usi SQLCipher nella tua app, vero? In caso contrario, per verificare approssimativamente se il database è stato scaricato correttamente, aprire il file DB in un visualizzatore (preferibilmente un visualizzatore esadecimale) e verificare se inizia con una SQLite format 3stringa. Assicurati anche di avere una sqliteversione corretta (cioè non stai cercando di aprire il database sqlite3 con l'eseguibile sqlite2). E puoi anche provare altri client SQLite (ad esempio SQLiteStudio ). Spero che sia d'aiuto.
Idolon

1
Ho problemi con l'unica linea. Funziona bene se eseguo il comando in una shell ma se metto in una riga ottengo: Il sistema non riesce a trovare il percorso specificato.
Rev Tyler

2
pacchetto <il mio pacchetto> è sconosciuto ... qualcuno sa perché. Ho installato tramite studio premendo il pulsante di debug.
Nathan Schwermann

4
Su Android Lollipop ricevopermission denied
Muhammad Babar

1
Ho estratto un database con due tabelle e una dozzina di righe in ciascuna e ho eseguito query di selezione completa su ciascuna tabella. Uno ha funzionato bene, l'altro ha riportato un errore di dati nel file. La mia ipotesi migliore in questo momento è una mancata corrispondenza di codifica tra Android e la shell locale.
Mason

23

Uso questo script di shell sul mio MAC, che copia il database direttamente nella mia cartella home. Facile soluzione con un clic, basta cambiare il nome del pacchetto (com.example.app) e il nome del database (database.sqlite)

Script semplice

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

Script che accetta argomenti [nome_pacchetto] [database]

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

Il primo comando stava creando una copia a zero byte del database, quindi ho apportato alcune modifiche al tuo script: gist.github.com/romulof/6af8a8919660f395f975
romulof

14

Il modo migliore per visualizzare e gestire il database delle app Android è utilizzare questa libreria https://github.com/sanathp/DatabaseManager_For_Android

Con questa libreria puoi gestire il database SQLite della tua app dalla tua app stessa. puoi visualizzare le tabelle nel database della tua app, aggiornare, eliminare, inserire righe nelle tue tabelle. Tutto dalla tua app.

È un singolo file di attività java, basta aggiungere il file java alla cartella di origine. Quando lo sviluppo è terminato, rimuovere il file java dalla cartella src è tutto.

Mi ha aiutato molto. Spero che aiuti anche te.

Puoi visualizzare la demo di 1 minuto qui: http://youtu.be/P5vpaGoBlBY


11

Sebbene sia una vecchia domanda, penso che sia ancora rilevante e meriti una risposta attuale. Sono disponibili strumenti che consentono di ispezionare direttamente i database (senza la necessità di estrarli dal dispositivo o dall'emulatore).

Lo strumento che ho scoperto di recente (e che preferisco di più) è il database di debug di Android .

Devi solo aggiungere questa dipendenza:

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

Non sono necessari ulteriori codici. Dopo aver avviato la tua app, apri logcat e filtra per "DebugDB" e troverai un messaggio che dice

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

Funziona con tutti i browser e puoi ispezionare le tabelle del database e le preferenze condivise.

inserisci qui la descrizione dell'immagine

Funziona anche con il predefinito e gli emulatori Genmony.


Lo strumento che ho usato prima è stetho .

Svantaggio: è necessario aggiungere un po 'di codice e si è vincolati al browser Chrome.

Vantaggio: hai la possibilità di ispezionare anche il traffico di rete.



5

Se ottieni

The system cannot find the path specified.

provare

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

Nota la doppia virgoletta!


3

Ho semplicemente fatto:

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

Quindi posso eseguire il debug di un database sqlite o qualunque cosa voglio fare dalla shell con le giuste autorizzazioni.


2

C'è un modo se un apk è debuggabile per utilizzare un programma chiamato run-as dalla shell adb (non root) per copiare il file privato di un'applicazione.


2

Ecco le istruzioni passo passo, per lo più prese da una combinazione delle altre risposte. Funziona con dispositivi che non sono sbloccati.

  1. Collega il tuo dispositivo e avvia l'applicazione in modalità debug.

  2. Copia il file del database dalla cartella dell'applicazione alla scheda SD: esegui:

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

  3. Estrai i file del database sulla tua macchina: esegui:

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

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

  5. Apri Firefox SQLLite Manager e apri il file del database dal passaggio 3 sopra.

  6. Godere!


2

Android Studio 4.1 Aggiunta una nuova funzionalità per visualizzare / modificare i database SQLite di Android.

inserisci qui la descrizione dell'immagine

Come aprire Database Inspector

Per aprire Database Inspector in Android Studio, è necessario selezionare View > Tool Windows > Database Inspector dalla barra dei menu.

Inoltre è necessario eseguire l'app su un dispositivo che esegue il livello API 26 o superiore.

Usando questo strumento puoi

  • Interroga i tuoi database

  • Modifica ed esegui il debug del tuo database

inserisci qui la descrizione dell'immagine


2

Nel nuovo Android Studio 4.1 c'è il nuovo Database Inspector .

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

È possibile selezionare le seguenti opzioni dalla barra dei menu View > Tool Windows > Database Inspectorper aprirla. Istruzioni più dettagliate possono essere trovate in questo blog .

Un altro modo è usare stetho per questo. Aggiungi la dipendenza e quindi puoi utilizzare Chrome DevTools (chrome: // inspect) per controllare il database quando il dispositivo è collegato.


1

È necessario eseguire adb come root o utilizzarlo su un telefono con root.

Per eseguire adb come root, usa adb root

Vedi anche: Perché ottengo l'accesso negato alla cartella dei dati quando utilizzo adb?


L'ho provato. Ma mi dà "adb non può essere eseguito come root nelle build di produzione"
Primal Pappachan

Dovrai eseguirlo in modalità Debug.
Malfist

Vedi questo: mydroidworld.com/forums/android-hacks/… Se lo stai eseguendo su un telefono e non su un emulatore, dovrai eseguire il root.
Malfist

Ho eseguito l'applicazione in modalità debug e ho provato anche i passaggi precedenti. Non funziona.
Primal Pappachan

Funziona solo per l'emulatore o un dispositivo rooted.
Slott

1

Nessuna delle soluzioni run-as-and-cat-to-sdcard ha funzionato per me su Android 4.4.2. Non ne sono sicuro, ma sospetto che possa essere dovuto al fatto che lo run-asstrumento non gestisce correttamente le nuove autorizzazioni sdcard_re sdcard_rw.

Per prima cosa ho dovuto copiare il file del database /filesnella memoria interna privata della mia applicazione:

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

Quindi ho copiato /sdcard/Android/data/com.example.myapp/filesin Javaland (questo richiede il WRITE_EXTERNAL_STORAGEpermesso):

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

Infine, ho copiato il file sul mio laptop:

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

1
C'è una soluzione più semplice. Se chmod 777 il tuo file sqlite, quindi esci da run-as, ti consentirà di copiarlo su / sdcard come normale usre.
zedix

1

Il mio dispositivo non aveva sdcard

quindi la prima soluzione non ha funzionato per me.

Se hai problemi simili, prova in questo modo:

  adb shell "run-as package chmod 777 /data/data/package/databases/yourdb.sqlite";
  adb pull /data/data/package/databases/yourdb.sqlite

/sdcardnon è necessariamente una scheda SD. Sul mio telefono punta alla memoria interna quando non è presente alcuna scheda SD fisica.
DearVolt

0

Prova questa app: SQLiteWeb ( https://play.google.com/store/apps/details?id=br.com.cm.sqliteweb ). Fornisce accesso remoto al database senza estrarlo.

Nella versione a pagamento, ha accesso root per database privato (/ data / data / nome-pacchetto ...) o implementa un provider di contenuti per connettersi utilizzando SQLiteWeb (istruzioni all'interno dell'app)

Ma se vuoi rimanere con la versione gratuita, puoi creare il tuo database in una memoria esterna:

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

0

Su OSX, utilizzando la risposta @Tadas con automator e sqllitebrowser ( https://github.com/sqlitebrowser/sqlitebrowser ):

  1. apri Automator e crea un nuovo flusso di lavoro.

  2. aggiungere l'azione "Esegui script shell".

  3. Incolla questo:

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

  4. fare clic su Esegui per aggiornare il database su sqlitebrowser.


0
  1. Apri un terminale
  2. cd <ANDROID_SDK_PATH>(per me su Windows cd C:\Users\Willi\AppData\Local\Android\sdk)
  3. cd platform-tools
  4. adb shell (funziona solo se è in esecuzione un solo emulatore)
  5. cd data/data
  6. su (ottieni privilegi di super utente)
  7. cd <PACKAGE_NAME>/databases
  8. sqlite3 <DB_NAME>
  9. emettere istruzioni SQL ( importante: terminarle con ;, altrimenti l'istruzione non viene emessa e si interrompe invece su una nuova riga.)

Nota: utilizzare ls(Linux) o dir(Windows) se è necessario elencare il contenuto della directory.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.