Cihazdaki sqlite veritabanının konumu


100

Varsayılan genişletme SQLiteOpenHelperve geçersiz kılma yolu ile programlı olarak bir sqlite veritabanı oluşturdum onCreate(). Bu şekilde db, gerektiğinde anında oluşturulur.

OS X makinemdeki db dosyasının içeriğini sqlite tarayıcı ile kontrol etmek istiyorum. Db dosyasının adını biliyorum ama onu cihazda bulamıyorum. Cihaza USB ile bağlandım ve bulucu ve terminal ile baktım, ancak db dosyasını bulamıyorum.

Android cihazdaki sqlite veritabanları için varsayılan konum nedir?


Yanıtlar:


96

Oluşturulan veritabanınızı bulabilirsiniz. <your-database-name>

içinde

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

Dosya gezgini kullanarak çekin ve SQLiteExplorer'da kullanmak için .db3 uzantısına sahip olacak şekilde yeniden adlandırın

Öykünücü dizinine gitmek için DDMS'nin Dosya gezginini kullanın.


1
Bunu bir emülatörde denediğimde, / data'ya cd yapabilirim. Ancak bunu bağlı Galaxy Vibrant'ımla denediğimde / veriye cd yapamıyorum. Bu iki durumda adb sunucusu farklı bir kullanım olarak mı çalışıyor?
Robᵩ

42
Gerçek bir telefonda / data klasörüne erişiminiz yok. Modifiye edilmiş 700. Görmek için kök ayrıcalıklarına ihtiyacınız var.
Falmarri

15
Yolu uygulamadan almak isterseniz bu, context.getDatabasePath ("<your-database-name>"). Aslında yukarıdaki yolu döndürür. Bu yola okuma-yazma için erişebilirsiniz, ancak yalnızca veritabanını oluşturan uygulamadan erişebilirsiniz.
Yaroslav Mytkalyk

Android'in veritabanlarını kaydettiği varsayılan yola root olmayan cihazlarda erişilemez. Bu nedenle, veritabanı dosyasına erişmenin en kolay yolu (yalnızca hata ayıklama ortamları için) sınıfın yapıcısını değiştirmektir. Bundan sonra bazı cevaplar (tam olarak burada: stackoverflow.com/a/21832714/2982814 ), bunu nasıl yönettiğimi bulacaksınız.
RandomUser


45

Bunun için yaptığım şey

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

Bunu yapmak için, uygulamanızın SD karta erişim izni olması gerekir, aşağıdaki ayarı manifest.xml dosyanıza ekleyin.

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

Harika bir yol değil ama işe yarıyor.


Güzel. Ben bunu arıyordum. Bu şekilde analiz için tam veri tabanını bir sunucuya yüklemek de seçilebilir.
Jeroen

3
işe yaramazsa ... veritabanı adını kullanın "/data/data/your.app.package/databases/your_db" Sadece ".db3" uzantısını kaldırın
Nigel

1
Bu çözüm iyi çalışıyor. Ancak, File nesnesini almak için getDatabasePath (your_db_name) kullanabilir ve onu oluşturmak yerine doğru yolu elde etmek için getAbsolutePath () kullanabilirsiniz. GetDatabasePath yöntemi ContextWrapper'da tanımlanmıştır.
Roy

Dosya ve yol adları Android'de büyük / küçük harfe duyarlıdır.
AndroidDev

30

Bağlam, birçok yol işlevi içerir: Context.getXXXPath ()
Bunlardan biri, dbname adlı bir veritabanının mutlak yolunu döndüren android.content.Context.getDatabasePath (Dize dbname) 'dir.

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

Bu durumda döndürülen yol şuna benzer bir şey olacaktır:

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

DB'yi açmak için SQLiteOpenHelper kullanılıyorsa bu yolun otomatik olarak oluşturulduğunu unutmayın.


25

Gerçek cihazdan bahsediyorsanız /data/data/<application-package-name>erişilemez. Kök haklarına sahip olmalısınız ...


Bu tam olarak doğru değil. Göz atılabilir değil , ancak içindeki dosyaların erişilebilirliği , bireysel izin bitlerine bağlıdır.
Chris Stratton

Telefonum köklü. Veri klasörüne nasıl "göz atabilirim"?
Sreecharan Desabattula

@SreecharanDesabattula, dizine göz atmak için adb kabuğuna gitmeniz ve "su" komutunu kullanarak süper kullanıcıya geçmeniz gerekir.
Gautham C.

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

@Sunnyday Trysudo su
Mohammedsalim Shivani

19

Bu ve eski bir soru, ancak cevap vermek başkalarına yardımcı olabilir.

Android'in veritabanlarını kaydettiği varsayılan yola root olmayan cihazlarda erişilemez. Bu nedenle, veritabanı dosyasına erişmenin en kolay yolu (yalnızca hata ayıklama ortamları için) sınıfın yapıcısını değiştirmektir:

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

Aşağıdaki satırlarla üretim ortamları için değiştirmeyi unutmayın:

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

Bu çalıştı ve hata döndürdü Failed to open database '/mnt/sdcard/itens'.içindeLogcat
underfilho

2
Çok üzgünüm. Bu cevap dört yaşında. Ve OP bundan daha eskidir (2010). Şu anda Android, 2010'dan önemli ölçüde farklıdır. Dolayısıyla, veritabanı konumu başka bir yolda olabilir. Üzgünüm, size daha fazla yardımcı olamam.
RandomUser

Muhtemelen hata, uygulamanın yazmasına izin verilmediğinden meydana geldi, yine de teşekkürler
underfilho

12

/data/data/packagename/databases/

yani

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


9

Bir SQLite veritabanı sadece bir dosyadır. Bu dosyayı alabilir, taşıyabilir ve hatta başka bir sisteme kopyalayabilirsiniz (örneğin, telefonunuzdan iş istasyonunuza) ve sorunsuz çalışır. Android, dosyayı /data/data/packagename/databases/dizinde depolar . Sen kullanabilirsiniz adb commandveya File Explorer viewEclipse (içinde Window > Show View > Other... > Android > File Explorergörünüme, olaya) veya silin.


9

Pekala, bu geç olabilir ama yardımcı olacaktır. Sen veritabanına erişebilir olmadan adb aracılığıyla cihazınızı köklenme

adb'yi cmd kullanarak başlatın ve aşağıdaki komutları yazın

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

Artık buradan açabilirsiniz.


4
Evet, hata ayıklama APK'sı için. Hayır, prodüksiyon için (veya run-as'ın bozuk olduğu Android sürümlerinde).
Chris Stratton

5

Eğer db'nizi bir yol vermeden bir dosya olarak adlandırırsanız, klasörünü almanın en yaygın yolu şudur:

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

nerede DBAdapter.DATABASE_NAMEsadece bir String"mydatabase.db" gibi.
Context.getFilesDir()aşağıdaki gibi uygulama dosyalarının yolunu döndürür: /data/data/<your.app.packagename>/files/bu yüzden .getParent()+"/databases/""dosyaları" kaldırmanız ve bunun yerine "veritabanları" eklemeniz gerekir.
BTW Eclipse sizi sabit kodlanmış "veri / veri /" dizesi konusunda uyaracak, ancak bu durumda değil.


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

Ve veritabanınızın Cihaz Depolamasında depolanıp depolanmadığını kontrol edin. Öyleyse, Manifest.xml'deki izni kullanmanız gerekir:

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

3

Adb kabuğunu kullanarak erişebilirsiniz nasıl yapılır

Yukarıdaki bağlantıdan içerik:

Eğitim: Bir Android veritabanına komut satırı kullanarak nasıl erişilir. Programınızda bir veritabanıyla uğraşmaya başladığınızda, programınızın dışında ona doğrudan erişebilmek, programın ne yaptığını kontrol etmek ve hata ayıklamak gerçekten önemli ve kullanışlıdır.

Ve Android için de önemlidir.

İşte bunu nasıl yapacağınız:

1) Emülatörü başlatın (veya gerçek cihazınızı PC'nize bağlayın). Bunun için genellikle Eclipse'deki programımdan birini başlatırım. 2) Android araçları dizininde bir komut istemi başlatın. 3) adb kabuğu yazın. Bu, emülatörünüzde / bağlı cihazınızda bir unix kabuğu başlatacaktır. 4) veritabanınızın olduğu dizine gidin: cd data / data burada cihazınızdaki tüm uygulamaların listesi var Uygulama dizininize gidin (dikkatli olun, Unix büyük / küçük harfe duyarlıdır !!) cd com.alocaly.LetterGame ve alçalt veritabanları dizininizde: cd veritabanları Burada tüm veritabanlarınızı bulabilirsiniz. Benim durumumda, yalnızca bir tane var (şimdi): SCORE_DB 5) Kontrol etmek / değiştirmek istediğiniz veritabanında sqlite'ı başlatın: sqlite3 SCORE_DB Buradan hangi tabloların mevcut olduğunu kontrol edebilirsiniz: .tables 6) istediğiniz herhangi bir SQL talimatını girin : Skordan * öğesini seçin;

Bu oldukça basit, ancak her ihtiyacım olduğunda nerede bulacağımı bilmiyorum.


1

Uygulamanız bir veritabanı oluşturursa, bu veritabanı varsayılan olarak dizine kaydedilir. DATA/data/APP_NAME/databases/FILENAME.

Yukarıdaki dizinin bölümleri aşağıdaki kurallara göre oluşturulmuştur. DATA, Environment.getDataDirectory () yönteminin döndürdüğü yoldur. APP_NAME, uygulamanızın adıdır. FILENAME, veritabanı için uygulama kodunuzda belirttiğiniz addır.


0

IDE'nizin Eclipse'in DDMS perspektifi gibi dizinde gezinmenize ve / veya Emülatörden veya köklü bir cihazdan dosya kopyalamanıza izin veren bir yardımcı programa sahip olup olmadığını da kontrol edebilirsiniz.


0

Veritabanı adınızı şu şekilde tanımlayın:

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

Veritabanınızı şurada görebilirsiniz:

storage/sdcard0/yourdatabasename.db

0

public class MySQLiteOpenHelper, SQLiteOpenHelper'ı genişletir {MySQLiteOpenHelper (Bağlam bağlamı) {süper (bağlam, "/mnt/sdcard/database_name.db", null, 0); }}

"/ Sdcard /" kodunu sabit kodlamayın; Bunun yerine Environment.getExternalStorageDirectory (). getPath () kullanın


0

Yolu gibi kodlama yapmayın //data/data/<Your-Application-Package-Name>/databases/<your-database-name>. Çoğu durumda işe yarıyor, ancak bu, cihazın birden fazla kullanıcıyı destekleyebileceği cihazlarda çalışmıyor. Yol şöyle olabilir //data/user/10/<Your-Application-Package-Name>/databases/<your-database-name>. Bunun olası çözümü kullanıyor context.getDatabasePath(<your-database-name>).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.