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.