Lokalizacja bazy danych sqlite na urządzeniu


100

Stworzyłem bazę danych sqlite programowo z domyślnym sposobem rozszerzania SQLiteOpenHelperi nadpisywania onCreate(). W ten sposób baza danych jest tworzona w locie w razie potrzeby.

Chciałbym sprawdzić zawartość pliku db na komputerze z systemem OS X za pomocą przeglądarki sqlite. Znam nazwę pliku db, ale nie mogę go znaleźć na urządzeniu. Połączyłem się z urządzeniem przez USB i szukałem wyszukiwarki i terminala, ale po prostu nie mogę znaleźć pliku db.

Jaka jest domyślna lokalizacja baz danych sqlite na urządzeniu z systemem Android?


Odpowiedzi:


96

Możesz znaleźć utworzoną bazę danych o nazwie <your-database-name>

w

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

Wyciągnij go za pomocą Eksploratora plików i zmień jego nazwę na rozszerzenie .db3, aby używać go w SQLiteExplorer

Użyj eksploratora plików DDMS, aby przejść do katalogu emulatora.


1
Kiedy próbuję tego w emulatorze, mogę cd do / data. Ale kiedy próbuję tego z moim podłączonym Galaxy Vibrant, nie mogę cd do / data. Czy serwer ADB działa w innym celu w tych dwóch przypadkach?
Robᵩ

42
Nie masz dostępu do folderu / data na prawdziwym telefonie. Jest chmodowany 700. Aby to zobaczyć, potrzebujesz uprawnień roota.
Falmarri

15
Na wszelki wypadek, jeśli chcesz uzyskać ścieżkę z aplikacji , jest to context.getDatabasePath („<your-database-name>”). Co w rzeczywistości zwraca ścieżkę powyżej. Możesz uzyskać dostęp do tej ścieżki w celu odczytu i zapisu, ale tylko z aplikacji, która utworzyła bazę danych.
Yaroslav Mytkalyk

Domyślna ścieżka, w której Android zapisuje bazy danych, nie może być dostępna na urządzeniach nierootowanych. Zatem najłatwiejszym sposobem uzyskania dostępu do pliku bazy danych (tylko w przypadku środowisk debugowania) jest zmodyfikowanie konstruktora klasy. Kilka odpowiedzi po tym (dokładnie tutaj: stackoverflow.com/a/21832714/2982814 ), dowiesz się, jak sobie z tym poradziłem.
RandomUser


45

W tym celu zrobiłem

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

Aby to zrobić, Twoja aplikacja musi mieć uprawnienia dostępu do karty SD, dodaj następujące ustawienie do pliku manifest.xml

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

Nie jest to genialny sposób, ale działa.


Miły. Szukałem tego. Można również w ten sposób przesłać pełną bazę danych na serwer w celu analizy.
Jeroen

3
jeśli to nie działa ... użyj nazwy bazy danych "/data/data/your.app.package/databases/your_db" Po prostu usuń rozszerzenie ".db3"
Nigel Crasto

1
To rozwiązanie działa dobrze. Ale możesz użyć getDatabasePath (twoja_nazwa_db), aby pobrać obiekt File i użyć metody getAbsolutePath (), aby uzyskać dokładną ścieżkę zamiast jej tworzenia. Metoda getDatabasePath jest zdefiniowana w ContextWrapper.
Roy

W nazwach plików i ścieżek w systemie Android rozróżniana jest wielkość liter.
AndroidDev

30

Kontekst zawiera wiele funkcji ścieżek: Context.getXXXPath ()
Jedną z nich jest android.content.Context.getDatabasePath (String dbname), która zwraca bezwzględną ścieżkę do bazy danych o nazwie dbname.

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

W tym przypadku zwracana ścieżka wyglądałaby następująco:

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

Zauważ, że ta ścieżka jest generowana automatycznie, jeśli używasz SQLiteOpenHelper do otwierania bazy danych.


25

Jeśli mówisz o prawdziwym urządzeniu /data/data/<application-package-name>jest niedostępne. Musisz mieć prawa roota ...


To nie do końca prawda. Nie można jej przeglądać , ale dostępność plików w ramach zależy od ich indywidualnych uprawnień.
Chris Stratton

Mój telefon jest zrootowany. Jak mogę „przeglądać” folder danych?
Sreecharan Desabattula

@SreecharanDesabattula, musisz przejść do powłoki adb i przełączyć się na superużytkownika za pomocą polecenia „su”, aby przeglądać katalog.
Gautham C.

/ system / bin / sh: su: not found
Sunnyday

@Sunnyday Trysudo su
Mohammedsalim Shivani

19

To jest stare pytanie, ale odpowiedź może pomóc innym.

Domyślna ścieżka, w której Android zapisuje bazy danych, nie może być dostępna na urządzeniach nierootowanych. Tak więc najłatwiejszym sposobem uzyskania dostępu do pliku bazy danych (tylko w przypadku środowisk debugowania) jest zmodyfikowanie konstruktora klasy:

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

Pamiętaj o zmianie dla środowisk produkcyjnych z tymi liniami:

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

Spróbowałem tego i zwróciłem błąd Failed to open database '/mnt/sdcard/itens'.wLogcat
underfilho

2
Tak mi przykro. Ta odpowiedź ma cztery lata. A OP jest starszy niż ten (2010). W tej chwili Android znacznie różni się od 2010. Tak więc lokalizacja bazy danych może znajdować się na innej ścieżce. Przepraszam, nie mogę być bardziej pomocny.
RandomUser

Prawdopodobnie wystąpił błąd, ponieważ aplikacja nie mogła pisać, mimo wszystko dzięki
underfilho

12

/data/data/packagename/databases/

to znaczy

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


9

Baza danych SQLite to tylko plik. Możesz zabrać ten plik, przenieść go, a nawet skopiować do innego systemu (na przykład z telefonu na stację roboczą) i będzie działać dobrze. Android przechowuje plik w /data/data/packagename/databases/katalogu. Możesz użyć adb commandlub File Explorer vieww Eclipse ( Window > Show View > Other... > Android > File Explorer), aby go wyświetlić, przenieść lub usunąć.


9

cóż, to może być późno, ale to pomoże. Możesz uzyskać dostęp do bazy danych bez rootowania urządzenia przez adb

uruchom adb za pomocą cmd i wpisz następujące polecenia

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

Teraz możesz otworzyć od teraz.


4
Tak, w przypadku pakietu APK do debugowania. Nie, w przypadku wersji produkcyjnej (lub wersji systemu Android, w których funkcja run-as jest zepsuta).
Chris Stratton

5

Jeśli nazwiesz swoją bazę danych jako plik bez podawania ścieżki, najczęstszym sposobem uzyskania jej folderu jest:

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

gdzie DBAdapter.DATABASE_NAMEjest po prostu String„mydatabase.db”.
Context.getFilesDir()zwraca ścieżkę do plików aplikacji, takich jak: /data/data/<your.app.packagename>/files/dlatego musisz .getParent()+"/databases/", aby zamiast tego usunąć „pliki” i dodać „bazy danych”.
BTW Eclipse ostrzeże Cię o zakodowanym na stałe ciągu „data / data /”, ale nie w tym przypadku.


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

I sprawdź, czy Twoja baza danych jest przechowywana w pamięci urządzenia. Jeśli tak, musisz użyć uprawnienia w pliku Manifest.xml:

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

3

Możesz uzyskać do niego dostęp za pomocą instrukcji powłoki adb

Treść z powyższego linku:

Samouczek: jak uzyskać dostęp do bazy danych systemu Android za pomocą wiersza poleceń. Kiedy zaczynasz zajmować się bazą danych w swoim programie, jest naprawdę ważne i przydatne, aby mieć do niej bezpośredni dostęp, poza programem, aby sprawdzić, co program właśnie zrobił, i debugować.

I to jest ważne także na Androidzie.

Oto jak to zrobić:

1) Uruchom emulator (lub podłącz swoje prawdziwe urządzenie do komputera). Zwykle w tym celu uruchamiam jeden z moich programów z Eclipse. 2) Uruchom wiersz polecenia w katalogu narzędzi systemu Android. 3) wpisz powłokę adb. Spowoduje to uruchomienie powłoki unixowej na twoim emulatorze / podłączonym urządzeniu. 4) przejdź do katalogu, w którym znajduje się twoja baza danych: cd data / data tutaj masz listę wszystkich aplikacji na twoim urządzeniu Przejdź do katalogu aplikacji (uwaga, w Unixie rozróżniana jest wielkość liter !!) cd com.alocaly.LetterGame i zejdź w katalogu baz danych: bazy danych cd Tutaj znajdziesz wszystkie swoje bazy danych. W moim przypadku jest tylko jeden (teraz): SCORE_DB 5) Uruchom sqlite na bazie danych, którą chcesz sprawdzić / zmienić: sqlite3 SCORE_DB Z tego miejsca możesz sprawdzić jakie tabele są obecne: .tables 6) wprowadź dowolną instrukcję SQL : wybierz * z Score;

Jest to dość proste, ale za każdym razem, gdy go potrzebuję, nie wiem, gdzie go znaleźć.


1

Jeśli aplikacja tworzy bazę danych, ta baza danych jest domyślnie zapisywana w katalogu DATA/data/APP_NAME/databases/FILENAME.

Części powyższego katalogu są zbudowane w oparciu o następujące zasady. DATA to ścieżka zwracana przez metodę Environment.getDataDirectory (). APP_NAME to nazwa Twojej aplikacji. NAZWA PLIKU to nazwa podana w kodzie aplikacji dla bazy danych.


0

Możesz również sprawdzić, czy Twoje IDE ma narzędzie, takie jak perspektywa DDMS Eclipse, które umożliwia przeglądanie katalogu i / lub kopiowanie plików do iz Emulatora lub zrootowanego urządzenia.


0

Zdefiniuj nazwę bazy danych, na przykład:

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

A swoją bazę danych możesz zobaczyć w:

storage/sdcard0/yourdatabasename.db

0

klasa publiczna MySQLiteOpenHelper rozszerza SQLiteOpenHelper {MySQLiteOpenHelper (kontekst kontekstowy) {super (kontekst, "/mnt/sdcard/database_name.db", null, 0); }}

Nie koduj na stałe „/ sdcard /”; zamiast tego użyj Environment.getExternalStorageDirectory (). getPath ()


0

Nie używaj ścieżki na stałe, takiej jak //data/data/<Your-Application-Package-Name>/databases/<your-database-name>. Cóż, działa w większości przypadków, ale ten nie działa na urządzeniach, w których urządzenie może obsługiwać wielu użytkowników. Ścieżka może być podobna //data/user/10/<Your-Application-Package-Name>/databases/<your-database-name>. Możliwym rozwiązaniem jest użycie context.getDatabasePath(<your-database-name>).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.