Cihazdaki sqlite veritabanında hata ayıklama


98

Şu anda Android için bir WiFi uygulaması üzerinde çalışıyorum. Cihazdaki veritabanına erişmeye çalışırken sorun yaşıyorum. Öykünücüde hata ayıklama benim için çalışmıyor, çünkü öykünücüde WiFi desteği yok. Veritabanı dosyasını cihazdan çekmeyi denedim.

adb pull data/data/package-name/databases/database-name

Ancak "İzin reddedildi" hatasını alıyorum. Bu cevapta Android: Veritabanı dosyaları nerede saklanıyor? Commonsware, veritabanı dosyasını hata ayıklama modunda çalıştırarak çekmeyi önerdi. Ama o da çalışmıyor. Cihazı köklendirmeden veritabanında nasıl hata ayıklanacağına dair herhangi bir yardım çok takdir edilecektir.

Yanıtlar:


142

Kendimi başka bir cevaptan tekrar edeceğim :

API seviye 8'den (Android 2.2) başlayarak, uygulamayı hata ayıklanabilir olarak oluşturursanız, shell run-askomutunu kullanarak bir komutu veya yürütülebilir dosyayı belirli bir kullanıcı / uygulama olarak çalıştırabilir veya sadece UIDuygulamanıza geçerek verilerine erişebilirsiniz. dizin.

Bu nedenle, uygulama veritabanınızı cihazdan çekmek isterseniz, uygulamanın hata ayıklama yapısını çalıştırmalı, bağlanmalı adb shellve aşağıdaki komutu çalıştırmalısınız:

run-as com.yourpackage sh -c "cat ~/databases/db-file" > /sdcard/db-file.sqlite

Bu, db-fileSD kartınızın / harici depolamanızın köküne kopyalayacaktır . Artık dosya yöneticisini adb pullveya istediğiniz herhangi bir şeyi kullanarak oradan kolayca alabilirsiniz . Bu yaklaşımla, uygulamanızınWRITE_EXTERNAL_STORAGE kopyalama her zaman harici depolamaya yazabilen kabuk kullanıcısı tarafından yapıldığından izne .

Linux / Mac sistemlerinde, adb kabuğuna girmeden kullanabileceğiniz aşağıdaki komutla bir veritabanını doğrudan bilgisayarınıza kopyalama imkanı vardır:

adb shell 'run-as com.yourpackage sh -c "cat ~/databases/db-file"' > db-file.sqlite

Ancak bu, CR / LF sembol dönüşümü nedeniyle Windows'ta düzgün çalışmayacaktır. Oradaki eski yöntemi kullanın.


1
@MikeIsrael Her ihtimale karşı, uygulamanızda SQLCipher kullanmıyorsunuz, değil mi? Değilse, veritabanının doğru bir şekilde indirilip indirilmediğini kabaca kontrol etmek için DB dosyasını bir görüntüleyicide (tercihen bir hex-görüntüleyici) açın ve SQLite format 3dizeyle başlayıp başlamadığını kontrol edin . Ayrıca doğru bir sqlitesürüme sahip olduğunuzdan emin olun (yani sqlite3 veritabanını sqlite2 çalıştırılabilir dosyasıyla açmaya çalışmıyorsunuz). Ayrıca diğer SQLite istemcilerini de deneyebilirsiniz (örneğin SQLiteStudio ). Umarım yardımcı olur.
Idolon

1
Tek astarla sorun yaşıyorum. Komutu bir kabukta çalıştırırsam iyi çalışıyor, ancak tek astarı koyarsam: Sistem belirtilen yolu bulamıyor.
Rev Tyler

2
<paketim> paketi bilinmiyor ... kimse nedenini biliyor. Hata ayıklama düğmesine basarak stüdyo üzerinden kurdum.
Nathan Schwermann

4
Android Lollipop'ta alıyorumpermission denied
Muhammad Babar

1
İki tablo ve her birinde bir düzine kadar satır içeren bir veritabanı çıkardım ve her tabloda tam seçim sorguları yaptım. Biri iyi çalıştı, diğeri dosyada bir veri hatası bildirdi. Şu anda en iyi tahminim, Android ve yerel kabuk arasında bir kodlama uyuşmazlığı.
Mason

23

Veritabanını doğrudan ana klasörüme kopyalayan MAC'imde bu kabuk komut dosyasını kullanıyorum. Tek tıkla kolay çözüm, sadece paket adını (com.example.app) ve veritabanı adını (database.sqlite) değiştirin

Basit Komut Dosyası

#!/bin/bash
adb -d shell 'run-as com.example.app cat /data/data/com.example.app/databases/database.sqlite > /sdcard/database.sqlite'
adb pull /sdcard/database.sqlite ~/

[Paket_adı] [veritabanı] bağımsız değişkenlerini kabul eden komut dosyası

#!/bin/bash

REQUIRED_ARGS=2
ADB_PATH=/Users/Tadas/Library/sdk/platform-tools/adb
PULL_DIR="~/"

if [ $# -ne $REQUIRED_ARGS ]
    then
        echo ""
        echo "Usage:"
        echo "android_db_move.sh [package_name] [db_name]"
        echo "eg. android_db_move.sh lt.appcamp.impuls impuls.db"
        echo ""
    exit 1
fi;


echo""

cmd1="$ADB_PATH -d shell 'run-as $1 cat /data/data/$1/databases/$2 > /sdcard/$2' "
cmd2="$ADB_PATH pull /sdcard/$2 $PULL_DIR"

echo $cmd1
eval $cmd1
if [ $? -eq 0 ]
    then
    echo ".........OK"
fi;

echo $cmd2
eval $cmd2

if [ $? -eq 0 ]
    then
    echo ".........OK"
fi;

exit 0

İlk komut, veritabanının sıfır baytlık bir kopyasını oluşturmaktı, bu yüzden betiğinizde bazı ayarlamalar yaptım: gist.github.com/romulof/6af8a8919660f395f975
romulof

14

Android uygulama veritabanınızı görüntülemenin ve yönetmenin en iyi yolu bu kitaplığı kullanmaktır https://github.com/sanathp/DatabaseManager_For_Android

Bu kitaplıkla, uygulamanızın SQLite veritabanını uygulamanızın kendisinden yönetebilirsiniz. Uygulama veritabanınızdaki tabloları görüntüleyebilir, güncelleyebilir, silebilir, tablolarınıza satır ekleyebilirsiniz.

Tek bir java aktivite dosyasıdır, sadece java dosyasını kaynak klasörünüze ekleyin. Geliştirme bittiğinde java dosyasını src klasörünüzden kaldırın, bu da o.

Bana çok yardımcı oldu. Umarım sana da yardımcı olur.

1 dakikalık demoyu buradan görüntüleyebilirsiniz: http://youtu.be/P5vpaGoBlBY


11

Yine de eski bir soru bence hala alakalı ve mevcut durum cevabını hak ediyor. Veritabanlarını doğrudan incelemenizi sağlayan (bunları cihazdan veya emülatörden çekmeye gerek kalmadan) kullanabileceğiniz araçlar vardır.

En son keşfettiğim (ve en çok tercih ettiğim) araç Android Hata Ayıklama Veritabanı .

Yalnızca bu bağımlılığı eklemeniz gerekir:

debugImplementation 'com.amitshekhar.android:debug-db:1.0.3'

Başka kod gerekmez. Uygulamanızı başlattıktan sonra, logcat'i açın ve "DebugDB" için filtre uyguladığınızda bir mesaj göreceksiniz.

D/DebugDB: Open http://192.168.178.XXX:8080 in your browser

Her tarayıcıyla çalışır ve veritabanı tablolarınızı ve paylaşılan tercihlerinizi inceleyebilirsiniz.

görüntü açıklamasını buraya girin

Ayrıca varsayılan ve Genymotion emülatörleriyle çalışır.


Daha önce kullandığım araç stetho .

Dezavantajı: Biraz kod eklemeniz gerekiyor ve Chrome tarayıcısına bağlısınız.

Avantaj: Ağ trafiğini de inceleme seçeneğiniz vardır.



5

Alırsan

The system cannot find the path specified.

Deneyin

adb -d shell "run-as com.yourpackage cat /data/data/com.yourpackage/databases/dbname.sqlite > /sdcard/dbname.sqlite"

Çift alıntıya dikkat edin!


3

Ben basitçe yaptım:

$ adb shell
shell@android:/ $ run-as myapp.package.name sh
shell@android:/data/data/myapp.package.name $

Sonra bir sqlite veritabanında hata ayıklayabilir veya kabuktan doğru izinlerle yapmak istediğim her şeyi yapabilirim.


2

Bir apk hata ayıklaması yapılabiliyorsa, bir uygulamanın özel dosyasını kopyalamak için (root olmayan) adb kabuğundan farklı çalıştır adlı bir programı kullanmanın bir yolu vardır.


2

İşte adım adım talimatlar - çoğunlukla diğer yanıtların bir kombinasyonundan alınmıştır. Bu, kilidi açılmamış cihazlarla çalışır.

  1. Cihazınızı bağlayın ve uygulamayı hata ayıklama modunda başlatın.

  2. Veritabanı dosyasını uygulama klasörünüzden sd kartınıza kopyalayın:

    ./adb -d shell 'com.yourpackge.name cat /data/data/com.yourpackge.name/databases/filename.sqlite> /sdcard/filename.sqlite olarak çalıştır'

  3. Veritabanı dosyalarını makinenize çekin: çalıştırın:

    ./adb pull / sdcard / execute: ./adb

  4. Firefox SQLLite Manager'ı kurun: https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/

  5. Firefox SQLLite Manager'ı açın ve veritabanı dosyanızı yukarıdaki 3. adımdan açın.

  6. Zevk almak!


2

Android Studio 4.1 Android SQLite veritabanlarını görüntülemek / düzenlemek için yeni bir özellik eklendi.

görüntü açıklamasını buraya girin

Veritabanı Denetçisi nasıl açılır

Veritabanı Denetçisini Android Studio'da açmak için şunu seçmeniz gerekir: View > Tool Windows > Database Inspector için menü çubuğundan .

Ayrıca uygulamayı API seviyesi 26 veya daha yüksek olan bir cihazda çalıştırmanız gerekir.

Bu aracı kullanarak şunları yapabilirsiniz:

  • Veritabanlarınızı sorgulayın

  • Veritabanınızı değiştirin ve hatalarını ayıklayın

görüntü açıklamasını buraya girin


2

Yeni Android Studio 4.1'de yeni Veritabanı Denetçisi var .

https://developer.android.com/studio/preview/features/images/database-inspector.gif

View > Tool Windows > Database InspectorAçmak için menü çubuğundan aşağıdaki seçenekleri seçebilirsiniz . Bu blogda daha ayrıntılı talimatlar bulunabilir .

Başka bir yol da bunun için stetho kullanmaktır . Bağımlılığı eklersiniz ve ardından, cihaz takıldığında veritabanını kontrol etmek için Chrome DevTools'u (chrome: // inspect) kullanabilirsiniz.


1

Adb'yi root olarak çalıştırmanız veya rootlu bir telefonda kullanmanız gerekir.

Adb'yi root olarak çalıştırmak için şunu kullanın: adb root

Ayrıca bkz: adb kullanırken neden veri klasörüne erişimim reddediliyor?


Bunu denedim. Ama bana "adb, üretim yapılarında kök olarak çalışamaz" veriyor
Primal Pappachan

Hata Ayıklama modunda çalıştırmanız gerekecek.
Malfist

Şuna bakın: mydroidworld.com/forums/android-hacks/… Eğer onu bir telefonda çalıştırıyorsanız ve bir emülatörde çalıştırıyorsanız, onu rootlamanız gerekir.
Malfist

Uygulamayı hata ayıklama modunda çalıştırdım ve yukarıdaki adımları da denedim. Çalışmıyor.
Primal Pappachan

Bu yalnızca öykünücü veya köklü bir cihaz için çalışır.
slott

1

run-as-Ve-cat-sdcard çözümlerinin hiçbiri Android 4.4.2'de benim için çalışmadı. Emin değilim, ancak bunun, run-asaracın yeni sdcard_rve sdcard_rwizinleri doğru şekilde işlememesinden kaynaklandığından şüpheleniyorum .

Öncelikle veritabanı dosyasını /filesuygulamamın özel dahili depolamasına kopyalamam gerekiyordu :

shell@hammerhead:/ $ run-as com.example.myapp   
shell@hammerhead:/data/data/com.example.myapp $ cp databases/mydb files/mydb

Sonra /sdcard/Android/data/com.example.myapp/filesJavaland'da kopyaladım (bu WRITE_EXTERNAL_STORAGEizin gerektirir ):

public class MainActivity extends BaseActivity {

    @Override
     protected void onCreate(Bundle savedInstanceState) {
         ...

         if (isExternalStorageWritable()) {
             final FileInputStream input;
             try {
                 input = openFileInput("mydb");

                 File output = new File(getExternalFilesDir(null), "mydb");

                 copy(input, output);
             } catch (FileNotFoundException e) {
                 e.printStackTrace();
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
     }

     public void copy(FileInputStream in, File dst) throws IOException {
         OutputStream out = new FileOutputStream(dst);

         // Transfer bytes from in to out
         byte[] buf = new byte[1024];
         int len;
         while ((len = in.read(buf)) > 0) {
             out.write(buf, 0, len);
         }
         in.close();
         out.close();
     }

     public boolean isExternalStorageWritable() {
         String state = Environment.getExternalStorageState();
         return Environment.MEDIA_MOUNTED.equals(state);
     }
 }

Sonunda dosyayı dizüstü bilgisayarıma kopyaladım:

$ adb pull /sdcard/Android/data/com.example.myapp/files/mydb

1
Daha basit bir çözüm var. Eğer sqlite dosyanızı 777 chmod ederseniz, sonra run-as'dan çıkarsanız, onu normal usre olarak / sdcard'a kopyalamanıza izin verir.
zedix

1

Cihazımda sdcard yoktu

bu yüzden ilk çözüm benim için işe yaramadı.

Benzer bir sorun yaşıyorsanız, şunu deneyin:

  adb shell "run-as package chmod 777 /data/data/package/databases/yourdb.sqlite";
  adb pull /data/data/package/databases/yourdb.sqlite

/sdcardmutlaka bir SD kart değildir. Telefonumda, fiziksel SD kart bulunmadığında dahili depolamaya işaret ediyor.
DearVolt

0

Bu uygulamayı deneyin: SQLiteWeb ( https://play.google.com/store/apps/details?id=br.com.cm.sqliteweb ). Veritabanınızı dışarı çekmeden uzaktan erişim sağlar.

Ücretli sürümde, özel veritabanı (/ data / data / paket-adı ...) için kök erişimi vardır veya SQLiteWeb kullanarak bağlanmak için bir İçerik Sağlayıcı uygular (uygulama içindeki talimatlar)

Ancak ücretsiz sürümde kalmak istiyorsanız, veritabanınızı harici depolamada oluşturabilirsiniz:

database = SQLiteDatabase.openDatabase(Environment.getExternalStorageDirectory()
        + "/" + DATABASE_NAME, null, DATABASE_VERSION);

0

OSX'te, automator ve sqllitebrowser ( https://github.com/sqlitebrowser/sqlitebrowser ) ile @Tadas yanıtını kullanarak :

  1. Automator'ı açın ve yeni iş akışı oluşturun.

  2. "Kabuk Komut Dosyasını Çalıştır" eylemini ekleyin.

  3. Bunu yapıştırın:

    kaynak ~ / .bash_profile adb kabuğu 'cat as /data/data/your_app_uid/databases/db.name> /tmp/db.name' adb pull /tmp/db.name ~ / open -a sqlitebrowser ~ / db. isim

  4. sqlitebrowser'daki veritabanını yenilemek için çalıştır'a tıklayın.


0
  1. Bir terminal açın
  2. cd <ANDROID_SDK_PATH>(Windows'ta benim için cd C:\Users\Willi\AppData\Local\Android\sdk)
  3. cd platform-tools
  4. adb shell (bu yalnızca bir emülatör çalışıyorsa çalışır)
  5. cd data/data
  6. su (süper kullanıcı ayrıcalıkları kazanın)
  7. cd <PACKAGE_NAME>/databases
  8. sqlite3 <DB_NAME>
  9. SQL deyimleri yayınlayın ( önemli: ile sonlandırın ;, aksi takdirde ifade verilmez ve bunun yerine yeni bir satıra bölünür.)

Not: Dizin içeriklerini listelemeniz gerekiyorsa ls(Linux) veya dir(Windows) kullanın.

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.