Android - вытащить базу данных SQlite на Android-устройство - PullRequest
92 голосов
/ 03 апреля 2012

Я искал повсюду и не могу найти точного ответа или учебника о том, как, если это возможно, сделать это.

возможно ли каким-либо образом извлечь базу данных устройства Android без необходимости рутировать ее? Мне просто нужно извлечь эти данные любым способом, чтобы собрать их на моем компьютере, так как я могу это сделать? Должен ли я перепрограммировать приложение или любой другой метод, о котором вы, ребята, знаете, но помните, не рутируя устройство. спасибо

Ответы [ 19 ]

177 голосов
/ 04 февраля 2013

Если ваше устройство работает под управлением Android v4 или выше, вы можете извлечь данные приложения, включая его базу данных, без root, используя команду adb backup, затем извлечь файл резервной копии и получить доступ к базе данных sqlite.

Первое резервное копирование данных приложения на компьютер через USB-кабель с помощью следующей команды, замените app.package.name на фактическое имя пакета приложения.

adb backup -f ~/data.ab -noapk app.package.name

Это предложит вам «разблокироватьустройство и подтвердите операцию резервного копирования ». Не указывайте пароль для резервного копирования , чтобы его можно было извлечь позже.Нажмите кнопку «Создать резервную копию моих данных» на вашем устройстве.На экране отобразится имя пакета, для которого вы выполняете резервное копирование, а затем закроется само собой после успешного завершения.

Полученный файл data.ab в вашей домашней папке содержит данные приложения в формате резервной копии Android.Чтобы извлечь его, используйте следующую команду:

dd if=data.ab bs=1 skip=24 | openssl zlib -d | tar -xvf -

Если приведенное выше завершилось ошибкой openssl:Error: 'zlib' is an invalid command., попробуйте следующее.

dd if=data.ab bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" | tar -xvf -

В результате получается папка apps/app.package.name/, содержащая приложениеданные, включая базу данных sqlite.

Более подробную информацию можно найти в оригинальном сообщении в блоге .

76 голосов
/ 03 апреля 2012

Обычный способ достичь желаемого - использовать команду извлечения ADB.

Другой способ, который я предпочитаю в большинстве случаев, - это скопировать базу данных по коду на SD-карту:

try {
    File sd = Environment.getExternalStorageDirectory();

    if (sd.canWrite()) {
        String currentDBPath = "/data/data/" + getPackageName() + "/databases/yourdatabasename";
        String backupDBPath = "backupname.db";
        File currentDB = new File(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();
        }
    }
} catch (Exception e) {

}

Не забудьте установить разрешение на запись на SD в своем манифесте, как показано ниже.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
68 голосов
/ 14 марта 2014

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

adb shell run-as package.name chmod 666 /data/data/package.name/databases/file
adb pull /data/data/package.name/databases/file

Пример:

adb shell run-as com.app chmod 666 /data/data/com.app/databases/data.db
adb pull /data/data/com.app/databases/data.db

Установить PATH adb для переменных среды или использовать команду cd для работы с папками-инструментами папки Android SDK.

Пример:

cd /folder/android-sdk/platform-tools/

, а затем использоватьКоманда выше


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

52 голосов
/ 23 сентября 2015

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

adb -d shell "run-as your.package.name cat databases/database.name" > target.sqlite

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

Обратите внимание, что эта конкретная команда будет работать только в том случае, если к вашему компьютеру подключено только одно устройство. Параметр -d означает, что будет выбрано только одно подключенное устройство. Но есть и другие параметры, которые вы можете использовать вместо:

  • -e будет нацелен на единственный работающий эмулятор
  • -s <serialnumber> предназначается для устройства с определенным серийным номером.

35 голосов
/ 20 мая 2017

Используя Android Studio 3.0 или более позднюю версию, можно извлекать базу данных (также общие предпочтения, каталог кэша и другие), если приложение работает в режиме отладки на устройстве без рута.

Чтобы вытащить базу данных с помощью Android Studio, выполните следующие действия.

  1. Нажмите Просмотреть > Инструмент Windows > Обозреватель файлов устройства .
  2. Развернуть / data / data / [имя-пакета] узлов.

Steps followed in Android Studio 3.0

6 голосов
/ 05 апреля 2017
 adb shell "run-as [package.name] chmod -R 777 /data/data/[package.name]/databases" 
 adb shell "mkdir -p /sdcard/tempDB" 
 adb shell "cp -r /data/data/[package.name]/databases/ /sdcard/tempDB/." 
 adb pull sdcard/tempDB/ . 
 adb shell "rm -r /sdcard/tempDB/*"
5 голосов
/ 14 августа 2014

Для Ubuntu (не только?):

см. Sergeis Ответ , но вместо openssl используйте zlib-flate:

cat appbackup.ab | (dd bs = 24 count = 0 skip = 1; cat) | Zlib-Flate -uncompress> appbackup.tar

В противном случае openssl, вероятно, выдаст:

openssl: Ошибка: 'zlib' - недопустимая команда.

потому что openssl не скомпилирован с поддержкой zlib в Ubuntu

1 голос
/ 24 февраля 2017

В качестве альтернативы вы можете использовать мою библиотеку Ultra Debugger . Это позволяет загружать базу данных в виде файла или редактировать значения непосредственно в браузере. Корень не нужен, очень прост в использовании.

1 голос
/ 03 июля 2015

вы можете легко извлечь файл sqlite с вашего устройства (root не требуется)

  1. Перейти к папке SDK
  2. cd platform-tools
  3. начало adb

    cd / sdk / platform-tools ./adb shell

    Затем введите в терминал следующую команду

    . / Adb -d shell "run-as com.your_packagename cat /data/data/com.your_packagename/databases/jokhanaNepal> /sdcard/jokhana.sqlite"

    Например,

    ./adb -d shell "run-as com.yuvii.app cat /data/data/com.yuvii.app/databases/jokhanaNepal> /sdcard/jokhana.sqlite"

1 голос
/ 12 августа 2017

На Mac (не требуется root)

1. Go to platform-tools folder.
2) Run following command in terminal.

./adb -d shell "run-as your.package.name cat databases/database.sqlite" > database.sqlite

Будет скопирован файл sqlite в папку platform-tools.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...