Как проверить базу данных на неустановленном устройстве 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 

Ответ 1

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

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.

Ответ 2

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

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

    adb shell run-as [пакет] 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]

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

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

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

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

Ответ 3

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

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.

Ответ 4

Здесь очень простой и понятный ответ: (Протестировано на Android one: отключено)

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 опция выбирает устройство по умолчанию, если имеет более одного эмулятора.

Ответ 5

Мне просто нужно было сделать что-то подобное, и есть способ сделать это, хотя это боль. Вам необходимо записать файл в качестве учетной записи пользователя приложения, а затем передать его в доступное для записи место. Это сработало для меня на моем 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

Ответ 6

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

Ответ 7

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 мне пришлось заменять базы данных на файлы

Ответ 8

Если после запуска

adb shell "run-as your.package.name"

вы получаете "run-as: Package" your.package.name "неизвестно", а затем попытайтесь получить базу данных из эмулятора. См. Здесь: fooobar.com/questions/66918/...

В Android Studio 3.0 нажмите "Просмотр" > "Инструменты" > "Проводник устройств". Разверните/данные/данные/[имя пакета].

Ответ 9

Я думаю, что это самый простой способ. Добавьте эту зависимость в ваш файл Gradle: debugImplementation 'com.amitshekhar.android:debug-db:1.0.0'

После этого, когда вы запустите ваше приложение в консоли, вы увидите сообщение: D/DebugDB: Откройте http://192.168.1.114:8080 в вашем браузере.

И есть ваша база данных.

Ответ 10

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

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

Ответ 11

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