Posizione del database sqlite sul dispositivo


100

Ho creato un database sqlite a livello di codice con il modo predefinito di estensione SQLiteOpenHelpere sovrascrittura onCreate(). In questo modo il db viene creato al volo quando necessario.

Vorrei controllare il contenuto del file db sulla mia macchina OS X con un browser sqlite. Conosco il nome del file db, ma non riesco a trovarlo sul dispositivo. Mi sono collegato al dispositivo tramite USB e ho cercato con Finder e terminale, ma non riesco a trovare il file db.

Qual è la posizione predefinita per un database sqlite su un dispositivo Android?


Risposte:


96

Puoi trovare il tuo database creato, denominato <your-database-name>

nel

//data/data/<Your-Application-Package-Name>/databases/<your-database-name>

Estrailo usando Esplora file e rinominalo per avere l'estensione .db3 per usarlo in SQLiteExplorer

Usa Esplora file di DDMS per navigare nella directory dell'emulatore.


1
Quando lo provo in un emulatore, posso eseguire il cd in / data. Ma quando lo provo con il mio Galaxy Vibrant collegato, non riesco a eseguire il cd su / data. Il server adb viene eseguito con un utilizzo diverso in questi due casi?
Robᵩ

42
Non hai accesso alla cartella / data su un telefono reale. È modificato 700. Hai bisogno dei privilegi di root per vederlo.
Falmarri

15
Nel caso in cui desideri ottenere il percorso dall'app , è context.getDatabasePath ("<your-database-name>"). Che in effetti restituisce il percorso sopra. È possibile accedere a questo percorso in lettura-scrittura ma solo dall'applicazione che ha creato il database.
Yaroslav Mytkalyk

Il percorso predefinito in cui Android salva i database non è accessibile su dispositivi non rootati. Quindi, il modo più semplice per accedere al file di database (solo per gli ambienti di debug) è modificare il costruttore della classe. Alcune risposte dopo questa (esattamente qui: stackoverflow.com/a/21832714/2982814 ), troverai come l'ho gestita.
Utente casuale


45

Per questo, quello che ho fatto è

File f=new File("/data/data/your.app.package/databases/your_db.db3");
FileInputStream fis=null;
FileOutputStream fos=null;

try
{
  fis=new FileInputStream(f);
  fos=new FileOutputStream("/mnt/sdcard/db_dump.db");
  while(true)
  {
    int i=fis.read();
    if(i!=-1)
    {fos.write(i);}
    else
    {break;}
  }
  fos.flush();
  Toast.makeText(this, "DB dump OK", Toast.LENGTH_LONG).show();
}
catch(Exception e)
{
  e.printStackTrace();
  Toast.makeText(this, "DB dump ERROR", Toast.LENGTH_LONG).show();
}
finally
{
  try
  {
    fos.close();
    fis.close();
  }
  catch(IOException ioe)
  {}
}

E per fare ciò, la tua app deve avere l'autorizzazione per accedere alla scheda SD, aggiungi la seguente impostazione al tuo manifest.xml

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Non è un modo brillante, ma funziona.


Bello. Stavo cercando questo. Si potrebbe anche scegliere di caricare il database completo su un server per l'analisi in questo modo.
Jeroen

3
se non funziona ... usa il nome del database "/data/data/your.app.package/databases/your_db" Rimuovi semplicemente l'estensione ".db3"
Nigel Crasto

1
Questa soluzione funziona bene. Ma puoi usare getDatabasePath (your_db_name) per ottenere l'oggetto File e usare getAbsolutePath () per ottenere un percorso preciso invece di costruirlo. Il metodo getDatabasePath è definito in ContextWrapper.
Roy

I nomi di file e percorsi fanno distinzione tra maiuscole e minuscole in Android.
AndroidDev

30

Il contesto contiene molte funzioni di percorso: Context.getXXXPath ()
Una di queste è android.content.Context.getDatabasePath (String dbname) che restituisce il percorso assoluto di un database chiamato dbname.

Context ctx = this; // for Activity, or Service. Otherwise simply get the context.
String dbname = "mydb.db";
Path dbpath = ctx.getDatabasePath(dbname);

Il percorso restituito, in questo caso, sarebbe qualcosa di simile:

/data/data/com.me.myapp/databases/mydb.db

Notare che questo percorso viene generato automaticamente se si utilizza SQLiteOpenHelper per aprire il DB.


25

Se stai parlando di un dispositivo reale non /data/data/<application-package-name>è accessibile. Devi avere i diritti di root ...


Non è esattamente vero. Non è sfogliabile , ma l' accessibilità dei file all'interno dipende dai singoli bit di autorizzazione.
Chris Stratton

Il mio telefono è rootato. Come posso "sfogliare" la cartella dei dati?
Sreecharan Desabattula

@SreecharanDesabattula, devi andare su adb shell e passare a superuser usando il comando "su" per navigare nella directory.
Gautham C.

/ system / bin / sh: su: non trovato
Sunnyday

@Sunnyday Trysudo su
Mohammedsalim Shivani

19

Questa è una vecchia domanda, ma rispondere può aiutare gli altri.

Il percorso predefinito in cui Android salva i database non è accessibile su dispositivi non rootati. Quindi, il modo più semplice per accedere al file di database (solo per ambienti di debug) è modificare il costruttore della classe:

public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    MySQLiteOpenHelper(Context context) {
        super(context, "/mnt/sdcard/database_name.db", null, 0);
    }
}

Ricordati di cambiare per ambienti di produzione con queste linee:

public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    MySQLiteOpenHelper(Context context) {
        super(context, "database_name.db", null, 0);
    }
}

Ho provato questo e ho restituito l'errore Failed to open database '/mnt/sdcard/itens'.inLogcat
underfilho

2
Sono così dispiaciuto. Questa risposta ha quattro anni. E l'OP è più vecchio di quello (2010). In questo momento, Android è significativamente diverso dal 2010. Quindi la posizione del database può essere in un altro percorso. Mi dispiace di non poterti aiutare di più.
RandomUser

Forse l'errore si è verificato perché l'app non era autorizzata a scrivere, grazie comunque
underfilho

12

/data/data/packagename/databases/

cioè

/data/data/com.example.program/databases/


9

Un database SQLite è solo un file. Puoi prendere quel file, spostarlo e persino copiarlo su un altro sistema (ad esempio, dal tuo telefono alla tua workstation) e funzionerà bene. Android memorizza il file nella /data/data/packagename/databases/directory. È possibile utilizzare adb commando File Explorer viewin Eclipse ( Window > Show View > Other... > Android > File Explorer) per visualizzarlo, spostarlo o eliminarlo.


9

beh, questo potrebbe essere in ritardo ma aiuterà. Puoi accedere al database senza eseguire il root del tuo dispositivo tramite adb

avvia l'adb usando cmd e digita i seguenti comandi

-run-as com.your.package  
-shell@android:/data/data/com.your.package $ ls  
cache  
databases  
lib  
shared_prefs  

Ora puoi aprire da qui in poi.


4
Sì, per un APK di debug. No, per uno di produzione (o su versioni di Android in cui run-as non funziona).
Chris Stratton

5

Se assegni un nome al tuo db come file senza fornire un percorso, il modo più comune per ottenere la sua cartella è come:

final File dbFile = new File(getFilesDir().getParent()+"/databases/"+DBAdapter.DATABASE_NAME);

dove DBAdapter.DATABASE_NAMEè solo un Stringtipo "miodatabase.db".
Context.getFilesDir()restituisce il percorso per i file dell'app come: /data/data/<your.app.packagename>/files/ecco perché è necessario .getParent()+"/databases/", per rimuovere "file" e aggiungere invece "database".
BTW Eclipse ti avviserà della stringa "data / data /" hardcoded ma non in questo caso.


3
By Default it stores to:    

String DATABASE_PATH = "/data/data/" + PACKAGE_NAME + "/databases/" + DATABASE_NAME;

Where:

String DATABASE_NAME = "your_dbname";
String PACKAGE_NAME = "com.example.your_app_name";

E controlla se il tuo database è archiviato in Device Storage. In tal caso, è necessario utilizzare l'autorizzazione in Manifest.xml:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

3

Puoi accedervi usando adb shell how-to

Contenuto dal link sopra:

Tutorial: come accedere a un database Android utilizzando una riga di comando. Quando inizi a gestire un database nel tuo programma, è molto importante e utile poterlo accedere direttamente, fuori dal tuo programma, per controllare cosa ha appena fatto il programma e per eseguire il debug.

Ed è importante anche su Android.

Ecco come farlo:

1) Avvia l'emulatore (o collega il tuo dispositivo reale al PC). Di solito avvio uno dei miei programmi da Eclipse per questo. 2) Avvia un prompt dei comandi nella directory degli strumenti di Android. 3) digita adb shell. Questo avvierà una shell unix sul tuo emulatore / dispositivo connesso. 4) vai nella directory dove si trova il tuo database: cd data / data qui hai l'elenco di tutte le applicazioni sul tuo dispositivo Vai nella directory delle tue applicazioni (attenzione, Unix distingue tra maiuscole e minuscole !!) cd com.alocaly.LetterGame e scendi nella directory dei tuoi database: cd databases Qui puoi trovare tutti i tuoi database. Nel mio caso, ce n'è solo una (ora): SCORE_DB 5) Avvia sqlite sul database che vuoi controllare / modificare: sqlite3 SCORE_DB Da qui puoi controllare quali tabelle sono presenti: .tables 6) inserisci qualsiasi istruzione SQL che desideri : seleziona * da Punteggio;

Questo è abbastanza semplice, ma ogni volta che ne ho bisogno non so dove trovarlo.


1

Se l'applicazione crea un database, questo database viene salvato nella directory per impostazione predefinita DATA/data/APP_NAME/databases/FILENAME.

Le parti della directory sopra sono costruite in base alle seguenti regole. DATA è il percorso restituito dal metodo Environment.getDataDirectory (). APP_NAME è il nome della tua applicazione. FILENAME è il nome specificato nel codice dell'applicazione per il database.


0

Puoi anche verificare se il tuo IDE ha un'utilità come la prospettiva DDMS di Eclipse che ti consente di navigare nella directory e / o copiare file da e verso l'emulatore o un dispositivo rooted.


0

Definisci il nome del tuo database come:

private static final String DATABASE_NAME = "/mnt/sdcard/hri_database.db";

E puoi vedere il tuo database in:

storage/sdcard0/yourdatabasename.db

0

la classe pubblica MySQLiteOpenHelper estende SQLiteOpenHelper {MySQLiteOpenHelper (Context context) {super (context, "/mnt/sdcard/database_name.db", null, 0); }}

Non codificare "/ sdcard /"; usa invece Environment.getExternalStorageDirectory (). getPath ()


0

Non hardcode percorso come //data/data/<Your-Application-Package-Name>/databases/<your-database-name>. Bene, funziona nella maggior parte dei casi, ma questo non funziona su dispositivi in ​​cui il dispositivo può supportare più utenti. Il percorso può essere come //data/user/10/<Your-Application-Package-Name>/databases/<your-database-name>. Una possibile soluzione a questo problema sta usando context.getDatabasePath(<your-database-name>).

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.