Debugging database sqlite di perangkat

98

Saya saat ini sedang mengerjakan aplikasi WiFi untuk Android. Saya mengalami masalah saat mencoba mengakses database di perangkat. Debugging di emulator tidak berhasil untuk saya, karena tidak ada dukungan WiFi di emulator. Saya mencoba menarik file database dari perangkat dengan menggunakan

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

Tapi saya mendapatkan pesan kesalahan "Izin ditolak". Dalam jawaban ini Android: Di mana file database disimpan? , Commonsware menyarankan untuk menarik file database dengan menjalankan mode debug. Tapi itu tidak berhasil juga. Bantuan apa pun tentang cara men-debug database tanpa me-rooting perangkat akan sangat dihargai.

Primal Pappachan
sumber

Jawaban:

142

Saya akan mengulangi diri saya dari jawaban lain :

Mulai dari API level 8 (Android 2.2), jika Anda membangun aplikasi sebagai debuggable, Anda dapat menggunakan run-asperintah shell untuk menjalankan perintah atau dieksekusi sebagai pengguna / aplikasi tertentu atau hanya beralih ke UIDaplikasi Anda sehingga Anda dapat mengakses datanya direktori.

Jadi, jika Anda ingin menarik database aplikasi Anda dari perangkat, Anda harus menjalankan debug build aplikasi, hubungkan adb shelldan jalankan perintah berikut:

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

Ini akan menyalin Anda db-fileke root kartu SD / penyimpanan eksternal Anda. Sekarang Anda dapat dengan mudah mendapatkannya dari sana dengan menggunakan pengelola file, adb pullatau apa pun yang Anda suka. Perhatikan bahwa dengan pendekatan ini, aplikasi Anda TIDAK perlu memiliki WRITE_EXTERNAL_STORAGEizin, karena penyalinan dilakukan oleh pengguna shell yang selalu dapat menulis ke penyimpanan eksternal.

Pada sistem Linux / Mac, terdapat kemungkinan untuk menyalin database langsung ke komputer Anda dengan perintah berikut yang dapat digunakan tanpa memasuki shell adb:

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

Namun ini tidak akan berfungsi dengan benar pada Windows karena konversi simbol CR / LF. Gunakan metode sebelumnya di sana.

Idolon
sumber
1
@MikeIsrael Untuk berjaga-jaga, Anda tidak menggunakan SQLCipher di aplikasi Anda bukan? Jika tidak, maka untuk memeriksa secara kasar apakah database diunduh dengan benar, buka file DB di penampil (lebih disukai penampil hex) dan periksa apakah itu dimulai dengan SQLite format 3string. Juga pastikan Anda memiliki sqliteversi yang benar (yaitu Anda tidak mencoba membuka database sqlite3 dengan sqlite2 dapat dieksekusi). Dan Anda juga dapat mencoba klien SQLite lainnya (misalnya SQLiteStudio ). Semoga membantu.
Idolon
1
Saya mengalami masalah dengan satu liner. Ini berfungsi dengan baik jika saya menjalankan perintah di shell tetapi jika saya meletakkan di satu liner saya mendapatkan: Sistem tidak dapat menemukan jalur yang ditentukan.
Rev Tyler
2
paket <my package> tidak diketahui ... ada yang tahu kenapa. Saya menginstal melalui studio dengan menekan tombol debug.
Nathan Schwermann
4
Di Android Lollipop saya mendapatkanpermission denied
Muhammad Babar
1
Saya menarik database dengan dua tabel dan selusin baris di masing-masing, dan melakukan kueri pemilihan penuh pada setiap tabel. Satu berfungsi dengan baik, yang lain melaporkan kesalahan data dalam file. Tebakan terbaik saya saat ini adalah ketidakcocokan encoding antara Android dan shell lokal.
Mason
23

Saya menggunakan skrip shell ini di MAC saya, yang menyalin database langsung ke folder rumah saya. Solusi satu klik yang mudah, cukup ubah nama paket (com.example.app) dan nama database (database.sqlite)

Script Sederhana

#!/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 ~/

Skrip yang menerima argumen [package_name] [database]

#!/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
Tadas Valaitis
sumber
Perintah pertama adalah membuat salinan database nol-byte, jadi saya membuat beberapa penyesuaian di skrip Anda: gist.github.com/romulof/6af8a8919660f395f975
romulof
14

Cara terbaik untuk melihat dan mengelola database aplikasi android Anda adalah dengan menggunakan perpustakaan ini https://github.com/sanathp/DatabaseManager_For_Android

Dengan pustaka ini, Anda dapat mengelola database SQLite aplikasi dari aplikasi Anda sendiri. Anda dapat melihat tabel di database aplikasi Anda, memperbarui, menghapus, menyisipkan baris ke tabel Anda. Semuanya dari aplikasi Anda.

Ini adalah file aktivitas java tunggal, cukup tambahkan file java ke folder sumber Anda. Ketika pengembangan selesai, hapus file java dari folder src Anda itu saja.

Itu sangat membantu saya. Semoga ini membantu Anda juga.

Anda dapat melihat demo 1 menit di sini: http://youtu.be/P5vpaGoBlBY

sanath_p
sumber
11

Meskipun, ini adalah pertanyaan lama yang menurut saya masih relevan dan layak mendapatkan jawaban negara saat ini. Ada alat yang tersedia, yang memungkinkan Anda untuk memeriksa database secara langsung (tanpa perlu menariknya dari perangkat atau emulator).

Alat yang paling saya temukan (dan paling disukai) adalah Android Debug Database .

Anda hanya perlu menambahkan ketergantungan ini:

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

Tidak diperlukan kode lebih lanjut. Setelah Anda memulai aplikasi, buka logcat dan filter "DebugDB" dan Anda akan menemukan pesan yang mengatakan

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

Ia bekerja dengan setiap browser dan Anda dapat memeriksa tabel database Anda dan preferensi bersama.

masukkan deskripsi gambar di sini

Ia juga bekerja dengan default dan emulator Genymotion.


Alat yang saya gunakan sebelumnya adalah stetho .

Kelemahan: Anda perlu menambahkan sedikit kode dan Anda terikat ke browser Chrome.

Keuntungan: Anda memiliki opsi untuk juga memeriksa lalu lintas jaringan.

Peter F.
sumber
5

Dalam aplikasi saya, saya mengekspor database ke kartu SD. Setelah database ada di kartu SD, database dapat diakses dengan mencolokkan perangkat ke komputer Anda.

Lihat posting ini: Membuat backup database ke SDCard di Android

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
sumber
5

Jika Anda mendapatkan

The system cannot find the path specified.

mencoba

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

Perhatikan kutipan ganda!

Gerold Meisinger
sumber
3

Saya hanya melakukan:

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

Kemudian saya dapat men-debug database sqlite atau apa pun yang ingin saya lakukan dari shell dengan izin yang tepat.

smichak
sumber
2

Ada cara jika apk dapat di-debug untuk menggunakan program yang disebut run-as dari shell adb (non-root) untuk menyalin file pribadi aplikasi.

Chris Stratton
sumber
2

Berikut adalah petunjuk langkah demi langkah - kebanyakan diambil dari kombinasi jawaban lainnya. Ini berfungsi dengan perangkat yang tidak terkunci.

  1. Hubungkan perangkat Anda dan luncurkan aplikasi dalam mode debug.

  2. Salin file database dari folder aplikasi Anda ke kartu sd Anda: jalankan:

    ./adb -d shell 'run-as com.yourpackge.name cat /data/data/com.yourpackge.name/databases/filename.sqlite> /sdcard/filename.sqlite'

  3. Tarik file database ke mesin Anda: jalankan:

    ./adb pull / sdcard / execution: ./adb

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

  5. Buka Firefox SQLLite Manager dan buka file database Anda dari langkah 3 di atas.

  6. Nikmati!

Andy Cochrane
sumber
2

Android Studio 4.1 Menambahkan fitur baru untuk melihat / mengedit database Android SQLite.

masukkan deskripsi gambar di sini

Cara membuka Database Inspector

Untuk membuka Database Inspector di Android Studio, Anda perlu memilih View > Tool Windows > Database Inspector dari menu bar.

Anda juga perlu menjalankan aplikasi ke perangkat yang menjalankan API level 26 atau lebih tinggi.

Dengan menggunakan alat ini Anda bisa

  • Buat kueri database Anda

  • Ubah dan debug database Anda

masukkan deskripsi gambar di sini

Sayang
sumber
2

Di Android Studio 4.1 baru ada Database Inspector baru .

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

Anda dapat memilih opsi berikut dari bilah menu View > Tool Windows > Database Inspectoruntuk membukanya. Instruksi lebih rinci dapat ditemukan di blog ini .

Cara lain adalah dengan menggunakan stetho untuk ini. Anda menambahkan dependensi lalu dapat menggunakan Chrome DevTools (chrome: // inspect) untuk memeriksa database saat perangkat dicolokkan.

jeprubio
sumber
1

Anda harus menjalankan adb sebagai root, atau menggunakannya di ponsel yang di-rooting.

Untuk menjalankan adb sebagai root, gunakan adb root

Lihat juga: Mengapa saya mendapatkan akses ditolak ke folder data saat menggunakan adb?

Malfist
sumber
Saya telah mencoba ini. Tapi itu memberi saya "adb tidak dapat dijalankan sebagai root dalam produksi membangun"
Primal Pappachan
Anda harus menjalankannya dalam mode Debug.
Malfist
Lihat ini: mydroidworld.com/forums/android-hacks/… Jika Anda menjalankannya di ponsel dan bukan emulator, Anda harus melakukan root.
Malfist
Saya menjalankan aplikasi dalam mode debug dan mencoba langkah-langkah di atas juga. Itu tidak berhasil.
Primal Pappachan
Ini hanya berfungsi untuk emulator atau perangkat yang di-rooting.
slott
1

Tidak ada solusi run-as-dan-cat-to-sdcard yang bekerja untuk saya di Android 4.4.2. Saya tidak yakin, tetapi saya curiga itu mungkin karena run-asalat tidak menangani izin sdcard_rdan baru dengan benar sdcard_rw.

Pertama-tama saya harus menyalin file database ke /filesdalam penyimpanan internal pribadi aplikasi saya:

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

Lalu saya salin ke /sdcard/Android/data/com.example.myapp/filesdi Javaland (ini membutuhkan WRITE_EXTERNAL_STORAGEizin):

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

Akhirnya, saya menyalin file ke laptop saya:

$ adb pull /sdcard/Android/data/com.example.myapp/files/mydb
pengguna167019
sumber
1
Ada solusi yang lebih sederhana. Jika Anda chmod 777 file sqlite Anda, kemudian keluar dari run-as, itu akan membiarkan Anda menyalinnya ke / sdcard sebagai usre biasa.
zedix
1

Perangkat saya tidak memiliki sdcard

jadi solusi pertama tidak berhasil untuk saya.

Jika Anda mengalami masalah serupa, coba seperti ini:

  adb shell "run-as package chmod 777 /data/data/package/databases/yourdb.sqlite";
  adb pull /data/data/package/databases/yourdb.sqlite
dsharew
sumber
/sdcardbelum tentu kartu SD. Di ponsel saya, ini menunjuk ke penyimpanan internal ketika tidak ada kartu SD fisik.
DearVolt
0

Coba aplikasi ini: SQLiteWeb ( https://play.google.com/store/apps/details?id=br.com.cm.sqliteweb ). Ini memberikan akses jarak jauh ke database Anda tanpa menariknya keluar.

Dalam versi berbayar, ia memiliki akses root untuk database pribadi (/ data / data / nama-paket ...) atau menerapkan Penyedia Konten untuk terhubung menggunakan SQLiteWeb (Instruksi di dalam aplikasi)

Tetapi jika ingin tetap menggunakan versi gratis, Anda dapat membuat database Anda di penyimpanan eksternal:

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

Di OSX, menggunakan jawaban @Tadas dengan automator dan sqllitebrowser ( https://github.com/sqlitebrowser/sqlitebrowser ):

  1. buka Automator dan buat alur kerja baru.

  2. tambahkan tindakan "Jalankan Shell Script".

  3. Tempel ini:

    source ~ / .bash_profile adb shell 'run-as cat /data/data/your_app_uid/databases/db.name> /tmp/db.name' adb pull /tmp/db.name ~ / open -a sqlitebrowser ~ / db. nama

  4. klik run untuk menyegarkan database di sqlitebrowser.

Zaster
sumber
0
  1. Buka terminal
  2. cd <ANDROID_SDK_PATH>(untuk saya di Windows cd C:\Users\Willi\AppData\Local\Android\sdk)
  3. cd platform-tools
  4. adb shell (ini hanya berfungsi jika hanya satu emulator yang berjalan)
  5. cd data/data
  6. su (dapatkan hak istimewa pengguna super)
  7. cd <PACKAGE_NAME>/databases
  8. sqlite3 <DB_NAME>
  9. menerbitkan pernyataan SQL ( penting: akhiri dengan ;, jika tidak, pernyataan tidak dikeluarkan dan malah akan rusak ke baris baru.)

Catatan: Gunakan ls(Linux) atau dir(Windows) jika Anda perlu membuat daftar isi direktori.

Willi Mentzel
sumber