Lokasi database sqlite di perangkat

100

Saya telah membuat database sqlite secara terprogram dengan cara default untuk memperluas SQLiteOpenHelperdan menimpa onCreate(). Dengan cara ini db dibuat dengan cepat saat dibutuhkan.

Saya ingin memeriksa konten file db di mesin OS X saya dengan browser sqlite. Saya tahu nama file dbnya, tetapi saya tidak dapat menemukannya di perangkat. Saya telah terhubung ke perangkat melalui USB dan mencari dengan finder dan terminal, tetapi saya tidak dapat menemukan file db.

Apa lokasi default untuk database sqlite di perangkat android?

Pompair
sumber
Lihat di sini: secara terprogram mendapatkan jalur database
shizhen

Jawaban:

96

Anda dapat menemukan database yang Anda buat, bernama <your-database-name>

di

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

Tarik keluar menggunakan File explorer dan ganti namanya menjadi memiliki ekstensi .db3 untuk digunakan di SQLiteExplorer

Gunakan File explorer dari DDMS untuk membuka direktori emulator.

Shardul
sumber
1
Saat saya mencobanya di emulator, saya bisa melakukan cd ke / data. Tetapi ketika saya mencobanya dengan Galaxy Vibrant saya yang terhubung, saya tidak dapat melakukan cd ke / data. Apakah server adb dijalankan sebagai penggunaan yang berbeda dalam dua kasus tersebut?
Robᵩ
42
Anda tidak memiliki akses ke folder / data di telepon asli. Ini chmoded 700. Anda membutuhkan hak akses root untuk melihatnya.
Falmarri
15
Untuk berjaga-jaga jika Anda ingin mendapatkan jalur dari aplikasi , itu adalah context.getDatabasePath ("<your-database-name>"). Yang ternyata mengembalikan jalur di atas. Anda dapat mengakses jalur ini untuk baca-tulis tetapi hanya dari aplikasi yang membuat database.
Yaroslav Mytkalyk
Jalur default tempat Android menyimpan database tidak dapat diakses pada perangkat yang tidak di-rooting. Jadi, cara termudah untuk mengakses file database (hanya untuk lingkungan debugging) adalah dengan memodifikasi konstruktor kelas. Beberapa jawaban setelah yang satu ini (tepatnya di sini: stackoverflow.com/a/21832714/2982814 ), Anda akan menemukan bagaimana saya mengaturnya.
RandomUser
Lihat di sini: secara programatik mendapatkan jalur database
shizhen
45

Untuk ini, yang saya lakukan adalah

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

Dan untuk melakukan ini, aplikasi Anda harus memiliki izin untuk mengakses kartu SD, tambahkan pengaturan berikut ke manifest.xml Anda

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

Bukan cara yang brilian, tapi berhasil.

RRTW
sumber
Bagus. Saya mencari ini. Seseorang juga dapat memilih untuk mengunggah db lengkap ke server untuk dianalisis dengan cara ini.
Jeroen
3
jika tidak berhasil ... gunakan nama database "/data/data/your.app.package/databases/your_db" Cukup hapus ekstensi ".db3"
Nigel Crasto
1
Solusi ini berfungsi dengan baik. Tapi, Anda bisa menggunakan getDatabasePath (your_db_name) untuk mendapatkan objek File dan menggunakan getAbsolutePath () untuk mendapatkan jalur yang akurat alih-alih membuatnya. Metode getDatabasePath didefinisikan di ContextWrapper.
Roy
Nama file dan jalur peka huruf besar / kecil di Android.
AndroidDev
30

Konteks berisi banyak fungsi jalur: Context.getXXXPath ()
Salah satunya adalah android.content.Context.getDatabasePath (String dbname) yang mengembalikan jalur absolut database yang disebut dbname.

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

Jalur yang dikembalikan, dalam hal ini, akan menjadi seperti ini:

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

Perhatikan bahwa jalur ini dibuat secara otomatis jika menggunakan SQLiteOpenHelper untuk membuka DB.

Shoham
sumber
25

Jika Anda berbicara tentang perangkat nyata /data/data/<application-package-name>tidak dapat diakses. Anda harus memiliki hak root ...

Bintang Merah Barmaley
sumber
Itu tidak sepenuhnya benar. Itu tidak dapat dijelajahi , tetapi aksesibilitas file di dalamnya bergantung pada bit izin masing-masing.
Chris Stratton
Ponsel saya di-root. Bagaimana cara "menelusuri" folder data?
Sreecharan Desabattula
@SreecharanDesabattula, Anda perlu pergi ke adb shell dan beralih ke superuser menggunakan perintah "su" untuk menjelajahi direktori.
Gautham C.
/ system / bin / sh: su: tidak ditemukan
Sunnyday
Coba @Sunnydaysudo su
Mohammedsalim Shivani
19

Ini dan pertanyaan lama, tetapi menjawab mungkin membantu orang lain.

Jalur default tempat Android menyimpan database tidak dapat diakses pada perangkat yang tidak di-rooting. Jadi, cara termudah untuk mengakses file database (hanya untuk lingkungan debugging) adalah dengan memodifikasi konstruktor kelas:

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

Ingatlah untuk mengubah lingkungan produksi dengan jalur ini:

public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    MySQLiteOpenHelper(Context context) {
        super(context, "database_name.db", null, 0);
    }
}
RandomUser
sumber
Saya mencoba ini dan mengembalikan kesalahan Failed to open database '/mnt/sdcard/itens'.diLogcat
underfilho
2
Saya minta maaf. Jawabannya adalah empat tahun. Dan OP lebih tua dari itu (2010). Saat ini, Android sangat berbeda dari tahun 2010. Jadi lokasi database bisa berada di jalur lain. Maaf, saya tidak bisa lebih membantu Anda.
RandomUser
Mungkin kesalahan terjadi karena aplikasi tidak diizinkan untuk menulis, terima kasih
underfilho
12

/data/data/packagename/databases/

yaitu

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

Ray Britton
sumber
9

Database SQLite hanyalah sebuah file. Anda dapat mengambil file itu, memindahkannya, dan bahkan menyalinnya ke sistem lain (misalnya, dari ponsel Anda ke workstation Anda), dan itu akan berfungsi dengan baik. Android menyimpan file tersebut di /data/data/packagename/databases/direktori. Anda dapat menggunakan adb commandatau File Explorer viewdi Eclipse ( Window > Show View > Other... > Android > File Explorer) untuk melihat, memindahkan, atau menghapusnya.

Teknologi Halos
sumber
9

baik ini mungkin terlambat tetapi itu akan membantu. Anda dapat mengakses database tanpa me - rooting perangkat Anda melalui adb

mulai adb menggunakan cmd dan ketik perintah berikut

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

Sekarang Anda dapat membukanya dari sini.

Ahmad Ali Nasir
sumber
4
Ya, untuk APK debug. Tidak, untuk produksi (atau rilis Android di mana run-as rusak).
Chris Stratton
5

Jika Anda menamai db Anda sebagai file tanpa memberikan jalur maka cara paling umum untuk mendapatkan foldernya adalah seperti:

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

di mana DBAdapter.DATABASE_NAMEhanya Stringseperti "mydatabase.db".
Context.getFilesDir()mengembalikan jalur untuk file aplikasi seperti: /data/data/<your.app.packagename>/files/itulah mengapa Anda perlu .getParent()+"/databases/", untuk menghapus "file" dan menambahkan "database" sebagai gantinya.
BTW Eclipse akan memperingatkan Anda tentang string "data / data /" yang di-hardcode, tetapi tidak dalam kasus ini.

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

Dan periksa apakah database Anda disimpan ke Penyimpanan Perangkat. Jika demikian, Anda harus menggunakan izin di Manifest.xml:

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

Anda dapat mengaksesnya menggunakan adb shell how-to

Konten dari tautan di atas:

Tutorial: Cara mengakses database Android dengan menggunakan baris perintah. Ketika Anda mulai berurusan dengan database dalam program Anda, sangatlah penting dan berguna untuk dapat mengaksesnya secara langsung, di luar program Anda, untuk memeriksa apa yang baru saja dilakukan oleh program, dan untuk men-debug.

Dan itu penting juga di Android.

Berikut cara melakukannya:

1) Luncurkan emulator (atau hubungkan perangkat asli Anda ke PC). Saya biasanya meluncurkan salah satu program saya dari Eclipse untuk ini. 2) Luncurkan command prompt di direktori alat android. 3) ketik adb shell. Ini akan meluncurkan shell unix pada emulator / perangkat Anda yang terhubung. 4) pergi ke direktori di mana database Anda: cd data / data di sini Anda memiliki daftar semua aplikasi di perangkat Anda Masuk ke direktori aplikasi Anda (hati-hati, Unix sensitif huruf !!) cd com.alocaly.LetterGame dan turun di direktori database Anda: cd databases Di sini Anda dapat menemukan semua database Anda. Dalam kasus saya, hanya ada satu (sekarang): SCORE_DB 5) Luncurkan sqlite pada database yang ingin Anda periksa / ubah: sqlite3 SCORE_DB Dari sini, Anda dapat memeriksa tabel apa yang ada: .tables 6) masukkan instruksi SQL yang Anda inginkan : pilih * dari Skor;

Ini cukup sederhana, tetapi setiap kali saya membutuhkannya, saya tidak tahu di mana menemukannya.

Dawid Drozd
sumber
1

Jika aplikasi Anda membuat database, database ini secara default disimpan di direktori DATA/data/APP_NAME/databases/FILENAME.

Bagian dari direktori di atas dibuat berdasarkan aturan berikut. DATA adalah jalur yang dikembalikan metode Environment.getDataDirectory (). APP_NAME adalah nama aplikasi Anda. FILENAME adalah nama yang Anda tentukan dalam kode aplikasi Anda untuk database.

AndroidGeek
sumber
0

Anda juga dapat memeriksa apakah IDE Anda memiliki utilitas seperti perspektif DDMS Eclipse yang memungkinkan Anda menjelajahi direktori dan / atau menyalin file ke dan dari Emulator atau perangkat yang di-rooting.

korosmatick.dll
sumber
0

Tentukan nama database Anda seperti:

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

Dan Anda dapat melihat database Anda di:

storage/sdcard0/yourdatabasename.db
Pankaj Arora
sumber
0

kelas publik MySQLiteOpenHelper extends SQLiteOpenHelper {MySQLiteOpenHelper (Konteks konteks) {super (konteks, "/mnt/sdcard/database_name.db", null, 0); }}

Jangan melakukan hardcode "/ sdcard /"; gunakan Environment.getExternalStorageDirectory (). getPath () sebagai gantinya

Namo
sumber
0

Jangan seperti hardcode path //data/data/<Your-Application-Package-Name>/databases/<your-database-name>. Yah itu berfungsi dalam banyak kasus, tetapi yang ini tidak berfungsi di perangkat di mana perangkat dapat mendukung banyak pengguna. Jalannya bisa seperti //data/user/10/<Your-Application-Package-Name>/databases/<your-database-name>. Solusi yang mungkin untuk ini adalah dengan menggunakan context.getDatabasePath(<your-database-name>).

Vytautas Berankis
sumber