Отладка базы данных sqlite на устройстве

98

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

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

Но я получаю сообщение об ошибке «Permission denied.». В этом ответе Android: Где хранятся файлы базы данных? , Commonsware предложило извлечь файл базы данных, запустив его в режиме отладки. Но это тоже не работает. Любая помощь в том, как отлаживать базу данных без рутирования устройства, будет очень признательна.

Первобытный Паппачан
источник

Ответы:

142

Повторюсь из другого ответа :

Начиная с уровня API 8 (Android 2.2), если вы создаете приложение как отлаживаемое, вы можете использовать команду оболочки run-asдля запуска команды или исполняемого файла в качестве конкретного пользователя / приложения или просто переключиться на UIDсвое приложение, чтобы вы могли получить доступ к его данным. каталог.

Поэтому, если вы хотите получить базу данных приложения с устройства, вам следует запустить отладочную сборку приложения, подключиться adb shellи выполнить следующую команду:

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

Это скопирует ваш файл db-fileв корень SD-карты / внешнего хранилища. Теперь вы можете легко получить это оттуда, используя файловый менеджер adb pullили что-то еще, что вам нравится. Обратите внимание, что при таком подходе вашему приложению НЕ нужно иметь WRITE_EXTERNAL_STORAGEразрешение, так как копирование выполняется пользователем оболочки, который всегда может писать во внешнее хранилище.

В системах Linux / Mac есть возможность скопировать базу данных прямо на ваш компьютер с помощью следующей команды, которую можно использовать без входа в оболочку adb:

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

Однако это не будет работать правильно в Windows из-за преобразования символов CR / LF. Используйте там первый метод.

Идолон
источник
1
@MikeIsrael На всякий случай, вы не используете SQLCipher в своем приложении? Если нет, то для грубой проверки правильности загрузки базы данных откройте файл БД в средстве просмотра (желательно шестнадцатеричном представлении) и проверьте, начинается ли он со SQLite format 3строки. Также убедитесь, что у вас правильная sqliteверсия (т.е. вы не пытаетесь открыть базу данных sqlite3 с помощью исполняемого файла sqlite2). И вы также можете попробовать другие клиенты SQLite (например, SQLiteStudio ). Надеюсь, поможет.
Idolon
1
У меня проблемы с одним лайнером. Он отлично работает, если я запускаю команду в оболочке, но если я вставляю один вкладыш, который я получаю: система не может найти указанный путь.
Преподобный Тайлер
2
package <мой пакет> неизвестен ... кто-нибудь знает почему. Я установил через студию, нажав кнопку отладки.
Натан Шверманн,
4
На Android Lollipop я получаюpermission denied
Мухаммад Бабар
1
Я вытащил базу данных с двумя таблицами и примерно с дюжиной строк в каждой и выполнил запросы полного выбора для каждой таблицы. Один работал нормально, другой сообщил об ошибке данных в файле. Мое лучшее предположение - несоответствие кодировки между Android и локальной оболочкой.
Мейсон
23

Я использую этот сценарий оболочки на своем MAC, который копирует базу данных прямо в мою домашнюю папку. Простое решение в один клик, просто измените имя пакета (com.example.app) и имя базы данных (database.sqlite)

Простой сценарий

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

Скрипт, принимающий аргументы [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
Тадас Валайтис
источник
Первая команда создавала нулевую копию базы данных, поэтому я внес некоторые изменения в ваш скрипт: gist.github.com/romulof/6af8a8919660f395f975
romulof
14

Лучший способ просматривать и управлять вашей базой данных приложения Android - использовать эту библиотеку https://github.com/sanathp/DatabaseManager_For_Android

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

Это единственный файл активности java, просто добавьте файл java в исходную папку. Когда разработка будет завершена, удалите файл java из папки src, которая и есть.

Мне это очень помогло. Надеюсь, это поможет и вам.

Вы можете просмотреть 1-минутную демонстрацию здесь: http://youtu.be/P5vpaGoBlBY

sanath_p
источник
11

Хотя это старый вопрос, я думаю, он все еще актуален и заслуживает ответа на текущий момент. Доступны инструменты, позволяющие проверять базы данных напрямую (без необходимости извлекать их из устройства или эмулятора).

Инструмент, который я обнаружил совсем недавно (и который мне больше всего нравится), - это Android Debug Database .

Вам нужно только добавить эту зависимость:

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

Дополнительный код не требуется. После запуска приложения откройте logcat и отфильтруйте "DebugDB", и вы увидите сообщение

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

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

введите описание изображения здесь

Он также работает с эмуляторами по умолчанию и с эмуляторами Genymotion.


Раньше я использовал стето .

Оборотная сторона: вам нужно добавить немного кода, и вы привязаны к браузеру Chrome.

Преимущество: у вас есть возможность также проверять сетевой трафик.

Питер Ф
источник
5

Если вы получите

The system cannot find the path specified.

пытаться

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

Обратите внимание на двойные кавычки!

Джеральд Мейзингер
источник
3

Я просто сделал:

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

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

смичак
источник
2

Если apk является отлаживаемым, есть способ использовать программу с именем run-as из оболочки adb (без полномочий root) для копирования частного файла приложения.

Крис Стрэттон
источник
2

Вот пошаговые инструкции, в основном взятые из комбинации других ответов. Это работает с устройствами, которые не разблокированы.

  1. Подключите ваше устройство и запустите приложение в режиме отладки.

  2. Скопируйте файл базы данных из папки приложения на SD-карту: выполните:

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

  3. Вытащите файлы базы данных на свой компьютер: выполните:

    ./adb pull / sdcard / выполнить: ./adb

  4. Установите Firefox SQLLite Manager: https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/

  5. Откройте Firefox SQLLite Manager и откройте файл базы данных из шага 3 выше.

  6. Наслаждайтесь!

Энди Кокрейн
источник
2

Android Studio 4.1 Добавлена ​​новая функция для просмотра / редактирования баз данных Android SQLite.

введите описание изображения здесь

Как открыть инспектор базы данных

Чтобы открыть инспектор базы данных в Android Studio, вам нужно выбрать View > Tool Windows > Database Inspectorв строке меню.

Также вам необходимо запустить приложение на устройстве с API уровня 26 или выше.

Используя этот инструмент, вы можете

  • Запросить ваши базы данных

  • Изменить и отладить вашу базу данных

введите описание изображения здесь

Дариш
источник
2

В новой версии Android Studio 4.1 появился новый инспектор баз данных .

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

Вы можете выбрать следующие параметры в строке меню, View > Tool Windows > Database Inspectorчтобы открыть ее. Более подробные инструкции можно найти в этом блоге .

Другой способ - использовать для этого стето . Вы добавляете зависимость, а затем можете использовать Chrome DevTools (chrome: // inspect) для проверки базы данных при подключении устройства.

Джепрубио
источник
1
Это лучший вариант на 2020 год и позже
Яир Кукиелка
1

Вам необходимо запустить adb с правами root или использовать его на рутированном телефоне.

Чтобы запустить adb как root, используйте adb root

См. Также: Почему я получаю отказ в доступе к папке данных при использовании adb?

Мальфист
источник
Я пробовал это. Но это дает мне «adb не может работать как root в производственных сборках»
Primal Pappachan
Вам нужно будет запустить его в режиме отладки.
Malfist 03
См. Это: mydroidworld.com/forums/android-hacks/… Если вы используете его на телефоне, а не в эмуляторе, вам придется выполнить рутинг.
Malfist 03
Я запустил приложение в режиме отладки и тоже попробовал описанные выше шаги. Не работает.
Primal Pappachan
Это работает только для эмулятора или корневого устройства.
slott
1

Ни одно из run-asрешений -and-cat-to-sdcard у меня не работало на Android 4.4.2. Я не уверен, но я подозреваю , что это может быть связано с run-asинструментом не правильно обработки новых sdcard_rи sdcard_rwразрешений.

Сначала мне пришлось скопировать файл базы данных /filesв личное внутреннее хранилище моего приложения:

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

Затем я скопировал /sdcard/Android/data/com.example.myapp/filesв Javaland (для этого требуется WRITE_EXTERNAL_STORAGEразрешение):

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

Наконец, я скопировал файл на свой ноутбук:

$ adb pull /sdcard/Android/data/com.example.myapp/files/mydb
user167019
источник
1
Есть более простое решение. Если вы chmod 777 ваш файл sqlite, а затем выйдите из run-as, это позволит вам скопировать его в / sdcard как обычный usre.
zedix
1

На моем устройстве не было SD-карты

поэтому первое решение у меня не сработало.

Если у вас возникла аналогичная проблема, попробуйте следующее:

  adb shell "run-as package chmod 777 /data/data/package/databases/yourdb.sqlite";
  adb pull /data/data/package/databases/yourdb.sqlite
Дшару
источник
/sdcardне обязательно SD-карта. На моем телефоне он указывает на внутреннюю память, когда физической SD-карты нет.
DearVolt 07
0

Попробуйте это приложение: SQLiteWeb ( https://play.google.com/store/apps/details?id=br.com.cm.sqliteweb ). Он обеспечивает удаленный доступ к вашей базе данных, не извлекая ее.

В платной версии он имеет root-доступ к частной базе данных (/ data / data / package-name ...) или реализует Content Provider для подключения с помощью SQLiteWeb (инструкции внутри приложения)

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

database = SQLiteDatabase.openDatabase(Environment.getExternalStorageDirectory()
        + "/" + DATABASE_NAME, null, DATABASE_VERSION);
Сезар Моригаки
источник
0

В OSX, используя ответ @Tadas с автоматом и sqllitebrowser ( https://github.com/sqlitebrowser/sqlitebrowser ):

  1. откройте Automator и создайте новый рабочий процесс.

  2. добавить действие «Запустить сценарий оболочки».

  3. Вставьте это:

    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. название

  4. нажмите «Выполнить», чтобы обновить базу данных в sqlitebrowser.

Застер
источник
0
  1. Откройте терминал
  2. cd <ANDROID_SDK_PATH>(для меня в Windows cd C:\Users\Willi\AppData\Local\Android\sdk)
  3. cd platform-tools
  4. adb shell (это работает, только если запущен только один эмулятор)
  5. cd data/data
  6. su (получить привилегии суперпользователя)
  7. cd <PACKAGE_NAME>/databases
  8. sqlite3 <DB_NAME>
  9. выдавать операторы SQL ( важно: завершить их ;, иначе оператор не выдается и вместо этого переводится на новую строку).

Примечание. Используйте ls(Linux) или dir(Windows), если вам нужно просмотреть содержимое каталога.

Вилли Ментцель
источник