Налагодження бази даних sqlite на пристрої


98

Зараз я працюю над додатком WiFi для Android. У мене виникають проблеми при спробі отримати доступ до бази даних на пристрої. Налагодження в емуляторі не працює для мене, оскільки в емуляторі немає підтримки WiFi. Я спробував витягнути файл бази даних з пристрою, використовуючи

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

Але я отримую помилку "У дозволі відмовлено". У цій відповіді Android: Де зберігаються файли баз даних? , Commonsware запропонував витягнути файл бази даних, працюючи в режимі налагодження. Але це теж не працює. Буде дуже вдячна будь-яка допомога щодо налагодження бази даних без вкорінення пристрою.

Відповіді:


142

Я повторюся з іншої відповіді :

Починаючи з рівня 8 API (Android 2.2), якщо ви будуєте додаток як налагоджуваний, ви можете використовувати команду shell 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 у своєму додатку, чи не так? Якщо ні, то, щоб приблизно перевірити, чи правильно була завантажена база даних, відкрийте файл DB у засобі перегляду (бажано шестнадцятковий) і перевірте, чи починається він з SQLite format 3рядка. Також переконайтеся, що у вас є правильна sqliteверсія (тобто ви не намагаєтесь відкрити базу даних sqlite3 з виконуваним sqlite2). Ви також можете спробувати інших клієнтів SQLite (наприклад, SQLiteStudio ). Сподіваюся, це допомагає.
Ідолон

1
У мене проблеми з одним лайнером. Це добре працює, якщо я запускаю команду в оболонці, але якщо я вкладаю в один вкладиш, я отримую: Система не може знайти вказаний шлях.
Преподобний Тайлер

2
пакунок <мій пакет> невідомо ... хтось знає чому. Я встановив через студію натисканням кнопки налагодження.
Натан Шверман

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

Сценарій, який приймає аргументи [ім'я пакета] [база даних]

#!/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 thats it.

Це мені дуже допомогло. Сподіваюсь, це теж допомагає вам.

Ознайомитися з однохвилинною демонстрацією можна тут: http://youtu.be/P5vpaGoBlBY


11

Хоча, це старе питання, я думаю, що воно все ще актуальне і заслуговує на поточну відповідь. Є доступні інструменти, які дозволяють безпосередньо перевіряти бази даних (без необхідності витягувати їх з пристрою чи емулятора).

Інструмент, який я нещодавно виявив (і вподобав більшість) - це база даних налагодження Android .

Вам потрібно лише додати цю залежність:

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, щоб скопіювати приватний файл програми.


2

Ось покрокові інструкції - в основному взяті з комбінації інших відповідей. Це працює з пристроями, які не розблоковані.

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

  2. Скопіюйте файл бази даних з папки програми на вашу sd-карту: Execute:

    ./adb -d оболонка 'run-as com.yourpackge.name cat /data/data/com.yourpackge.name/databases/filename.sqlite> /sdcard/filename.sqlite'

  3. Перетягніть файли бази даних на вашу машину: Execute:

    ./adb pull / sdcard / Execute: ./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

Потрібно запускати adb як root або використовувати його на вкоріненому телефоні.

Щоб запустити adb як root, використовуйте adb root

Дивіться також: Чому мені під час використання adb мені заборонено доступ до папки даних?


Я спробував це. Але це дає мені "adb не може працювати як root у виробництві"
Primal Pappachan

Вам потрібно буде запустити його в режимі налагодження.
Мальфіст

Дивіться це: mydroidworld.com/forums/android-hacks/… Якщо ви запускаєте його по телефону, а не емулятору, вам доведеться викорінити його.
Мальфіст

Я запустив програму в режимі налагодження і також спробував вищезазначені кроки. Це не працює.
Primal Pappachan

Це працює лише для емулятора або вкоріненого пристрою.
слот

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

1
Є більш просте рішення. Якщо chmod 777 ваш файл sqlite, а потім вийти з запуску, він дозволить вам скопіювати його на / sdcard як звичайний usre.
zedix

1

Мій пристрій не мав sdcard

тому перше рішення не спрацювало для мене.

Якщо у вас виникає подібна проблема, спробуйте так:

  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

0

Спробуйте це додаток: SQLiteWeb ( https://play.google.com/store/apps/details?id=br.com.cm.sqliteweb ). Він забезпечує віддалений доступ до вашої бази даних, не витягуючи її.

У платній версії він має кореневий доступ до приватної бази даних (/ data / data / name-package ...) або впроваджує Провайдер вмісту для з'єднання за допомогою 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), якщо вам потрібно перелічити вміст каталогу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.