Speicherort der SQLite-Datenbank auf dem Gerät

100

Ich habe programmgesteuert eine SQLite-Datenbank mit der Standardmethode zum Erweitern SQLiteOpenHelperund Überschreiben erstellt onCreate(). Auf diese Weise wird die Datenbank bei Bedarf im laufenden Betrieb erstellt.

Ich möchte den Inhalt der Datenbankdatei auf meinem OS X-Computer mit einem SQLite-Browser überprüfen. Ich kenne den Namen der Datenbankdatei, kann ihn aber auf dem Gerät nicht finden. Ich habe mich über USB mit dem Gerät verbunden und mit Finder und Terminal gesucht, aber ich kann die Datenbankdatei einfach nicht finden.

Was ist der Standardspeicherort für SQLite-Datenbanken auf einem Android-Gerät?

Pompair
quelle

Antworten:

96

Sie finden Ihre erstellte Datenbank mit dem Namen <your-database-name>

im

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

Ziehen Sie es mit dem Datei-Explorer heraus und benennen Sie es in die Erweiterung .db3 um, um es in SQLiteExplorer zu verwenden

Verwenden Sie den Datei-Explorer von DDMS, um zum Emulatorverzeichnis zu navigieren.

Shardul
quelle
1
Wenn ich das in einem Emulator versuche, kann ich auf / data cd. Aber wenn ich das mit meinem angeschlossenen Galaxy Vibrant versuche, kann ich nicht auf / data cd. Wird der ADB-Server in diesen beiden Fällen unterschiedlich verwendet?
Robᵩ
42
Sie haben auf einem echten Telefon keinen Zugriff auf den Ordner / data. Es ist modifiziert 700. Sie benötigen Root-Rechte, um es zu sehen.
Falmarri
15
Nur für den Fall, dass Sie den Pfad von der App erhalten möchten, ist es context.getDatabasePath ("<Ihr-Datenbankname>"). Was in der Tat den obigen Pfad zurückgibt. Sie können auf diesen Pfad zum Lesen und Schreiben zugreifen, jedoch nur über die Anwendung, die die Datenbank erstellt hat.
Jaroslaw Mytkalyk
Der Standardpfad, in dem Android Datenbanken speichert, kann auf nicht gerooteten Geräten nicht aufgerufen werden. Der einfachste Weg, auf Datenbankdateien zuzugreifen (nur für Debugging-Umgebungen), besteht darin, den Konstruktor der Klasse zu ändern. Einige Antworten nach dieser (genau hier: stackoverflow.com/a/21832714/2982814 ) finden Sie, wie ich das geschafft habe.
RandomUser
45

Dafür habe ich getan

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

Dazu muss Ihre App über die Berechtigung zum Zugriff auf die SD-Karte verfügen. Fügen Sie Ihrer manifest.xml die folgenden Einstellungen hinzu

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

Kein brillanter Weg, aber funktioniert.

RRTW
quelle
Nett. Ich habe danach gesucht. Auf diese Weise kann auch die gesamte Datenbank zur Analyse auf einen Server hochgeladen werden.
Jeroen
3
Wenn es nicht funktioniert ... verwenden Sie den Datenbanknamen "/data/data/your.app.package/databases/your_db". Entfernen Sie einfach die Erweiterung ".db3"
Nigel Crasto
1
Diese Lösung funktioniert gut. Sie können jedoch getDatabasePath (your_db_name) verwenden, um das Dateiobjekt abzurufen, und getAbsolutePath () verwenden, um einen genauen Pfad abzurufen, anstatt ihn zu erstellen. Die Methode getDatabasePath ist in ContextWrapper definiert.
Roy
Bei Datei- und Pfadnamen wird bei Android zwischen Groß- und Kleinschreibung unterschieden.
AndroidDev
29

Der Kontext enthält viele Pfadfunktionen: Context.getXXXPath ()
Eine davon ist android.content.Context.getDatabasePath (String dbname), der den absoluten Pfad einer Datenbank namens dbname zurückgibt.

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

Der zurückgegebene Pfad wäre in diesem Fall ungefähr so:

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

Beachten Sie, dass dieser Pfad automatisch generiert wird, wenn Sie SQLiteOpenHelper zum Öffnen der Datenbank verwenden.

Shoham
quelle
25

Wenn Sie über ein echtes Gerät sprechen, /data/data/<application-package-name>ist der Zugriff nicht möglich. Sie müssen Root-Rechte haben ...

Barmaley Roter Stern
quelle
Das stimmt nicht genau. Es ist nicht durchsuchbar , aber die Zugänglichkeit von Dateien hängt von ihren einzelnen Berechtigungsbits ab.
Chris Stratton
Mein Telefon ist gerootet. Wie kann ich den Datenordner "durchsuchen"?
Sreecharan Desabattula
@SreecharanDesabattula, Sie müssen zur ADB-Shell gehen und mit dem Befehl "su" zum Superuser wechseln, um das Verzeichnis zu durchsuchen.
Gautham C.
/ system / bin / sh: su: nicht gefunden
Sunnyday
@Sunnyday Trysudo su
Mohammedsalim Shivani
19

Dies ist eine alte Frage, aber die Beantwortung kann anderen helfen.

Der Standardpfad, in dem Android Datenbanken speichert, kann auf nicht gerooteten Geräten nicht aufgerufen werden. Der einfachste Weg, auf Datenbankdateien zuzugreifen (nur für Debugging-Umgebungen), besteht darin, den Konstruktor der Klasse zu ändern:

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

Denken Sie daran, Änderungen für Produktionsumgebungen mit folgenden Zeilen vorzunehmen:

public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    MySQLiteOpenHelper(Context context) {
        super(context, "database_name.db", null, 0);
    }
}
RandomUser
quelle
Ich habe dies versucht und den Fehler Failed to open database '/mnt/sdcard/itens'.inLogcat
underfilho
1
Es tut mir Leid. Diese Antwort ist vier Jahre alt. Und das OP ist älter als das (2010). Derzeit unterscheidet sich Android erheblich von 2010. Der Datenbankspeicherort kann sich also auf einem anderen Pfad befinden. Es tut mir leid, dass ich Ihnen nicht weiterhelfen kann.
RandomUser
Möglicherweise ist der Fehler aufgetreten , weil die App nicht zu schreiben durfte, trotzdem danke
underfilho
12

/data/data/packagename/databases/

dh

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

Ray Britton
quelle
9

Eine SQLite-Datenbank ist nur eine Datei. Sie können diese Datei nehmen, verschieben und sogar auf ein anderes System kopieren (z. B. von Ihrem Telefon auf Ihre Workstation), und es funktioniert einwandfrei. Android speichert die Datei im /data/data/packagename/databases/Verzeichnis. Sie können das adb commandoder das File Explorer viewin Eclipse ( Window > Show View > Other... > Android > File Explorer) verwenden, um es anzuzeigen, zu verschieben oder zu löschen.

HalosTechnologies
quelle
9

Nun, das könnte spät sein, aber es wird helfen. Sie können auf die Datenbank zugreifen, ohne Ihr Gerät über adb zu rooten

Starten Sie die ADB mit cmd und geben Sie die folgenden Befehle ein

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

Jetzt können Sie von hier aus öffnen.

Ahmad Ali Nasir
quelle
4
Ja, für eine Debug-APK. Nein, für eine Produktion (oder für Android-Versionen, bei denen Run-As fehlerhaft ist).
Chris Stratton
5

Wenn Sie Ihre Datenbank als Datei benennen, ohne einen Pfad anzugeben, lautet die häufigste Methode zum Abrufen des Ordners wie folgt:

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

wo DBAdapter.DATABASE_NAMEist nur eine Stringwie "mydatabase.db". Gibt den
Context.getFilesDir()Pfad für die Dateien der App zurück wie: /data/data/<your.app.packagename>/files/Deshalb müssen Sie .getParent()+"/databases/""Dateien" entfernen und stattdessen "Datenbanken" hinzufügen.
BTW Eclipse warnt Sie vor fest codierten Zeichenfolgen "data / data /", in diesem Fall jedoch nicht.

Stan
quelle
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";

Überprüfen Sie, ob Ihre Datenbank im Gerätespeicher gespeichert ist. Wenn ja, müssen Sie die Berechtigung in Manifest.xml verwenden:

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

Sie können mit der ADB-Shell - Anleitung darauf zugreifen

Inhalt vom obigen Link:

Tutorial: So greifen Sie über eine Befehlszeile auf eine Android-Datenbank zu. Wenn Sie anfangen, sich mit einer Datenbank in Ihrem Programm zu befassen, ist es wirklich wichtig und nützlich, direkt außerhalb Ihres Programms darauf zugreifen zu können, zu überprüfen, was das Programm gerade getan hat, und zu debuggen.

Und es ist auch auf Android wichtig.

So geht's:

1) Starten Sie den Emulator (oder verbinden Sie Ihr reales Gerät mit Ihrem PC). Normalerweise starte ich dafür eines meiner Programme von Eclipse. 2) Starten Sie eine Eingabeaufforderung im Android Tools-Verzeichnis. 3) Geben Sie adb shell ein. Dadurch wird eine Unix-Shell auf Ihrem Emulator / angeschlossenen Gerät gestartet. 4) Gehen Sie in das Verzeichnis, in dem sich Ihre Datenbank befindet: CD-Daten / Daten Hier haben Sie die Liste aller Anwendungen auf Ihrem Gerät. Gehen Sie in Ihr Anwendungsverzeichnis (Vorsicht, Unix unterscheidet zwischen Groß- und Kleinschreibung !!). CD com.alocaly.LetterGame und absteigen in Ihrem Datenbankverzeichnis: CD-Datenbanken Hier finden Sie alle Ihre Datenbanken. In meinem Fall gibt es (jetzt) ​​nur eine: SCORE_DB 5) Starten Sie SQLite in der Datenbank, die Sie überprüfen / ändern möchten: sqlite3 SCORE_DB Von hier aus können Sie überprüfen, welche Tabellen vorhanden sind: .tables 6) Geben Sie eine beliebige SQL-Anweisung ein : Wählen Sie * aus Punktzahl;

Das ist ganz einfach, aber jedes Mal, wenn ich es brauche, weiß ich nicht, wo ich es finden kann.

Dawid Drozd
quelle
1

Wenn Ihre Anwendung eine Datenbank erstellt, wird diese Datenbank standardmäßig im Verzeichnis gespeichert DATA/data/APP_NAME/databases/FILENAME.

Die Teile des obigen Verzeichnisses basieren auf den folgenden Regeln. DATA ist der Pfad, den die Environment.getDataDirectory () -Methode zurückgibt. APP_NAME ist Ihr Anwendungsname. FILENAME ist der Name, den Sie in Ihrem Anwendungscode für die Datenbank angeben.

Zar E Ahmer
quelle
0

Sie können auch überprüfen, ob Ihre IDE über ein Dienstprogramm wie die DDMS-Perspektive von Eclipse verfügt, mit dem Sie das Verzeichnis durchsuchen und / oder Dateien zum und vom Emulator oder einem gerooteten Gerät kopieren können.

korosmatick
quelle
0

Definieren Sie Ihren Datenbanknamen wie folgt:

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

Und Sie können Ihre Datenbank sehen in:

storage/sdcard0/yourdatabasename.db
Pankaj Arora
quelle
0

öffentliche Klasse MySQLiteOpenHelper erweitert SQLiteOpenHelper {MySQLiteOpenHelper (Kontextkontext) {super (Kontext, "/mnt/sdcard/database_name.db", null, 0); }}

Nicht fest codieren "/ sdcard /"; Verwenden Sie stattdessen Environment.getExternalStorageDirectory (). getPath ()

Namo
quelle
0

Nicht Hardcode Pfad wie //data/data/<Your-Application-Package-Name>/databases/<your-database-name>. Nun, es funktioniert in den meisten Fällen, aber dieses funktioniert nicht auf Geräten, auf denen das Gerät mehrere Benutzer unterstützen kann. Der Weg kann wie sein //data/user/10/<Your-Application-Package-Name>/databases/<your-database-name>. Mögliche Lösung hierfür ist die Verwendung context.getDatabasePath(<your-database-name>).

Vytautas Berankis
quelle