Как проверить базу данных на неустановленном устройстве Android

Я разрабатываю приложение, где я использую базу данных sqllite3 для хранения значений. У меня есть Nexus S и Nexus 7, которые являются невращающимися устройствами. Как я могу получить базу данных для моего приложения для целей отладки.

Я пробовал (1) Я пробовал весь подход, упомянутый здесь

adb shell run-as app.package.name \ cp /data/data/package.name/databases/application.sqlite /sdcard/ exit adb pull /sdcard/application.sqlite ~/ 

Это говорит, что cp не найден ..

(2) http://developer.android.com/tools/help/adb.html#sqlite

 adb -s emulator-5554 shell # sqlite3 /data/data/com.example.google.rss.rssexample/databases/rssitems.db SQLite version 3.3.12 Enter ".help" for instructions .... enter commands, then quit... sqlite> .exit 

Solutions Collecting From Web of "Как проверить базу данных на неустановленном устройстве Android"

Вы можете записать свою базу данных во внешнюю память следующим образом:

 private void writeToSD() throws IOException { File sd = Environment.getExternalStorageDirectory(); if (sd.canWrite()) { String currentDBPath = DB_NAME; String backupDBPath = "backupname.db"; File currentDB = new File(DB_PATH, currentDBPath); File backupDB = new File(sd, backupDBPath); if (currentDB.exists()) { FileChannel src = new FileInputStream(currentDB).getChannel(); FileChannel dst = new FileOutputStream(backupDB).getChannel(); dst.transferFrom(src, 0, src.size()); src.close(); dst.close(); } } } 

Где DB_NAME – это имя моей базы данных, а DB_PATH определяется следующим образом:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { DB_PATH = context.getFilesDir().getAbsolutePath().replace("files", "databases") + File.separator; } else { DB_PATH = context.getFilesDir().getPath() + context.getPackageName() + "/databases/"; } 

И добавьте следующее разрешение (спасибо @Sathesh за указание этого):

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

Я вызываю этот метод в любое время, когда у меня есть запись базы данных, так что мой самый текущий файл базы данных находится во внешней памяти, и я могу просмотреть его и отлаживать оттуда.

Затем вы можете использовать приложение X-Plore для просмотра базы данных из внешней памяти прямо на устройстве Android.

Следующее решение работает только для приложений, которые отлаживаются. Он может не работать на всех устройствах, так как команда run-as не работает на некоторых устройствах, особенно с Jelly Bean.

  1. Создайте * .bat-файл и скопируйте следующие сценарии

    Adb shell run-as [package] chmod 777 / data / data / [package] / databases /

    Adb shell run-as [package] chmod 777 / data / data / [package] / databases / [db_file_name]

    Adb shell run-as [package] cp / data / data / [package] / databases / [db_file_name] / sdcard /

    Adb pull / sdcard / [db_file_name]

  2. Измените [пакет] на требуемый пакет приложений

  3. Измените [db_file_name] на нужное имя db. Запустите файл bat, и вы увидите скопированную базу данных в той же папке, что и файл bat.

Вышеупомянутое решение предполагает:

  • Вы работаете в Windows
  • Устройство подключено и отображается под «adb devices»

Если вы не знаете свой путь к программе, вы можете использовать это:

 public void copyAppDbToExternalStorage() throws IOException { File sd = Environment.getExternalStorageDirectory(); File currentDB = getApplicationContext().getDatabasePath("databaseName"); //databaseName=your current application database name, for example "my_data.db" if (sd.canWrite()) { File backupDB = new File(sd, "toDatabaseName"); // for example "my_data_backup.db" if (currentDB.exists()) { FileChannel src = new FileInputStream(currentDB).getChannel(); FileChannel dst = new FileOutputStream(backupDB).getChannel(); dst.transferFrom(src, 0, src.size()); src.close(); dst.close(); } } } 

Или, если вам нужна копия базы данных в общедоступную папку «Загрузить», вы можете использовать это:

 public void copyAppDbToDownloadFolder() throws IOException { File backupDB = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "toDatabaseName"); // for example "my_data_backup.db" File currentDB = getApplicationContext().getDatabasePath("databaseName"); //databaseName=your current application database name, for example "my_data.db" if (currentDB.exists()) { FileChannel src = new FileInputStream(currentDB).getChannel(); FileChannel dst = new FileOutputStream(backupDB).getChannel(); dst.transferFrom(src, 0, src.size()); src.close(); dst.close(); } } 

Это отлично работает на моем устройстве Nexus 4.

Вот простой и простой ответ: (Протестировано на Android one: unrooted )

 adb -d shell $ run-as my.package.name $ cp databases/mydatabase.db /sdcard/mydatabase.db $ exit $ exit 

Теперь потяните вашу базу данных по пути adb по умолчанию

 adb -d pull /sdcard/mydatabase.db 

Или, например, на ваш рабочий стол

 adb -d pull /sdcard/mydatabase.db C:\Users\user\Desktop 

Вы можете удалить копию с помощью следующей команды:

 adb -d shell "rm /sdcard/mydatabase.db" 

-d выбирает устройство по умолчанию, если имеет более одного эмулятора.

Мне просто нужно было сделать что-то подобное, и есть способ сделать это, хотя это боль. Вам необходимо записать файл в качестве учетной записи пользователя приложения, а затем передать его в доступное для записи место. Это работало для меня на моем Nexus 4 с 4.3.3:

 adb shell "run-as org.your.application cat /data/data/org.your.application/your-file > /mnt/sdcard/your-file" adb pull /mnt/sdcard/your-file 

Попробуйте использовать библиотеку stetho, разработанную с помощью facebook, она позволяет просматривать db через веб-браузер https://facebook.github.io/stetho/

 adb shell "run-as CHR.Droid chmod 666 /data/data/CHR.Droid/files/CHR.db" adb shell cp /data/data/CHR.Droid/files/CHR.db /sdcard/ 

В Xamrin.forms мне пришлось заменять базы данных на файлы

Вы не можете получить доступ к папке с данными на ненагруженном устройстве

Это невозможно. Android имеет отличные механизмы безопасности. Только ваше приложение может получить доступ к своим собственным файлам.

Это невозможно с помощью некорневого телефона. Вы не можете получить доступ к каталогу / data, поэтому вы не можете скопировать базу данных или использовать приложение sqlite, как в (2). Если вам нужно отлаживать, используйте симулятор или запросы на запуск приложения для проверки базы данных.