Android - вытащить базу данных SQlite на Android-устройство

81

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

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

Показать ещё 2 комментария
Теги:

19 ответов

75
Лучший ответ

Общим способом достижения желаемого является использование команды вытягивания 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" />
  • 1
    ну, я собираюсь использовать это на вкладке Samsung Galaxy, у которой нет SD-карты, так как я могу сделать это там?
  • 0
    и я должен использовать двойной //?
Показать ещё 5 комментариев
173

Если ваше устройство работает под управлением Android v4 или выше, вы можете вытащить данные приложения, включая базу данных, без, используя команду 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.

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

  • 9
    Для тех, у кого zlib не скомпилирован без zlib, ознакомьтесь с ответом на blog.shvetsov.com/2013/02/…, чтобы извлечь данные с помощью python.
  • 0
    В случае, если вы не смогли извлечь файл (по какой-либо причине), вы можете использовать это небольшое программное обеспечение на окнах, которое позволяет легко использовать графический интерфейс, а не командную строку. android.stackexchange.com/questions/28481/...
Показать ещё 12 комментариев
68

Для отлаживаемых приложений 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 для Enviroment Variables или используйте команду cd для платформы платформы Android sdk.

Пример:

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

то используйте команду


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

  • 8
    После того, как я заменил package.name на пакет приложения, возвращается ошибка: run-as: Package 'com.my.app' is unknown
  • 3
    Кажется, это не работает для всех телефонов. Работает на Nexus 4, не работает, например, для SGS4.
Показать ещё 7 комментариев
45

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

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

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

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

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

  • 0
    Как я могу открыть этот файл?
  • 0
    @Jehad: у меня была такая же проблема. Я нашел этот способ, и он работает для меня. Установите SSHDroid на свой телефон. adb -d shell "run-as your.package.name cat databases/database_name.db > /mnt/sdcard/database_name.db" запустит SSHDroid запустит FileZilla и подключится к вашему телефону по протоколу SFTP. Установите / mnt / sdcard в качестве удаленного каталога по умолчанию.
17

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

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

  • Нажмите Показать > Инструмент Windows > Проводник > .
  • Разверните узлы /data/data/[package-name].

Изображение 1135

  • 0
    Благодарю. Загруженные файлы из эмулятора, но не могут получить их из неутвержденного Galaxy S4.
  • 0
    Можете ли вы извлечь базу данных из любого приложения или просто из вашего собственного приложения?
Показать ещё 1 комментарий
5
 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

Для 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

На 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 в папку инструментов платформы.

  • 0
    Кажется, это работает, только если приложение скомпилировано для отладки.
  • 0
    @DavidBerry Да, он будет извлекать дб, если скомпилирован для отладки, иначе вы могли бы вытащить дб любого приложения. И это будет серьезной проблемой безопасности приложения. :)
1

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

1

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

  • Перейдите в папку SDK
  • cd platform-tools
  • начать adb

    cd/sdk/платформы-инструменты . /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

Так как для меня ничего не работает. Я создаю маленькие окна BATCH script на основе других ответов, объединенных вместе. Надеюсь, это поможет кому-то. Простое использование: backupDatabase <PackageName> <ApplicationName> [TargetDirectory]. Он использует метод резервного копирования Сергея и Android Backup Extractor.

@echo off

if [%1]==[] goto usage
if [%2]==[] goto usage
if NOT [%4]==[] goto usage

@echo Processing: preparations
set PACKAGE=%1
set APPLICATION_NAME=%2
set TARGET_DIR=%cd%
IF NOT "%~3"=="" set TARGET_DIR=%3

set PATH_ADB="c:\Program Files (x86)\Android\android-studio\sdk\platform-tools"
set PATH_ABE="c:\Programs\android-backup-extractor-20140630-bin"
set PATH_7Z="c:\Program Files\7-Zip"

@echo Processing: backup
%PATH_ADB%\adb.exe backup -f %TARGET_DIR%\%APPLICATION_NAME%\%APPLICATION_NAME%.ab -noapk %PACKAGE%

@echo Processing: unpack
java -jar %PATH_ABE%\abe.jar unpack %TARGET_DIR%\%APPLICATION_NAME%\%APPLICATION_NAME%.ab %TARGET_DIR%\%APPLICATION_NAME%\%APPLICATION_NAME%.ab.tar

@echo Processing: extract
cd %TARGET_DIR%\%APPLICATION_NAME%
%PATH_7Z%\7z.exe e %APPLICATION_NAME%.ab.tar "apps\%PACKAGE%\db\%APPLICATION_NAME%"

@echo Processing: cleaning
del %APPLICATION_NAME%.ab
del %APPLICATION_NAME%.ab.tar
goto :eof

:usage
@echo.Pull out SQLite database file from your android device.
@echo.Needs: - connected device
@echo.       - device enable backup.
@echo.       - application enable backup
@echo.       - application in debug mode
@echo.       - installed Android Backup Extractor 
@echo.       - installed command line TAR extractor (7z, ...)
@echo.Does NOT need: root device
@echo.
@echo.Uses: - ADB backup (set PATH_ADB)
@echo.      - Android Backup Extractor (http://sourceforge.net/projects/adbextractor/) (set PATH_ABE)
@echo.      - Extract TAR container, uses 7z (set PATH_7Z)
@echo.
@echo.Usage: backupDatabase ^<PackageName^> ^<ApplicationName^> [TargetDirectory]
@echo.Example: backupDatabase com.foo.example ExampleApp 
@echo Example: backupDatabase com.foo.example ExampleApp workspace\AndroidProjects\Example
exit /B 1
0

Я даю полное решение "сохранить" и "восстановить" базу данных приложения в/из внутреннего хранилища (а не на ПК с adb).

Я сделал два метода: один для сохранения и другой для восстановления базы данных. Используйте эти методы в конце onCreate() в MainActivity (тот или другой, если вы хотите сохранить или восстановить базу данных).

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

void copyDatabase (){
        try {
            final String inFileName = "/data/data/<pakage.name>/databases/database.db";
            final String outFileName = Environment.getExternalStorageDirectory() + "database_backup.db";
            File dbFile = new File(inFileName);
            FileInputStream fis = new FileInputStream(dbFile);


            Log.d(TAG, "copyDatabase: outFile = " + outFileName);

            // Open the empty db as the output stream
            OutputStream output = new FileOutputStream(outFileName);

            // Transfer bytes from the inputfile to the outputfile
            byte[] buffer = new byte[1024];
            int length;
            while ((length = fis.read(buffer)) > 0) {
                output.write(buffer, 0, length);
            }

            // Close the streams
            output.flush();
            output.close();
            fis.close();
        }catch (Exception e){
            Log.d(TAG, "copyDatabase: backup error");
        }
    }

восстановить базу данных из внутреннего хранилища:

void restoreDatabase (){
        try {
            final String inFileName = Environment.getExternalStorageDirectory() + "database_backup.db";
            final String outFileName = "/data/data/<package.name>/databases/database.db";
            File dbFile = new File(inFileName);
            FileInputStream fis = new FileInputStream(dbFile);

            Log.d(TAG, "copyDatabase: outFile = " + outFileName);

            // Open the empty db as the output stream
            OutputStream output = new FileOutputStream(outFileName);

            // Transfer bytes from the inputfile to the outputfile
            byte[] buffer = new byte[1024];
            int length;
            while ((length = fis.read(buffer)) > 0) {
                output.write(buffer, 0, length);
            }

            // Close the streams
            output.flush();
            output.close();
            fis.close();
        }catch (Exception e){
            Log.d(TAG, "copyDatabase: backup error");
        }
    }
0

Вот решение с фотографиями о том, как вы можете получить доступ к неуправляемой файловой системе телефона Android android ssh от ubuntu 16.04

как получить доступ к неучтенной файловой системе телефона Android and ssh от ubuntu 16.04

0

Если вы пытаетесь сделать это на android 6, запросите разрешение и используйте код ответа на этот вопрос

if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_RC); 
    return; 
} 

Как только он будет предоставлен

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == STORAGE_PERMISSION_RC) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //permission granted  start reading or writing database
        } else { 
            Toast.makeText(this, "No permission to read external storage.", Toast.LENGTH_SHORT).show();
        } 
    } 
} 
0

Если вы находитесь на Android 4.0 или выше, а вы на Mac, то вот рубин script, который сохранит ваше содержимое приложения на рабочем столе. Я бы предположил, что это также будет работать в Ubuntu, хотя я не тестировал его.

puts "enter your package name"
package_name = gets.chomp
puts "press the 'Back up my data' button on your device"
`adb backup -f ~/Desktop/data.ab -noapk #{package_name}`
puts "press enter once once the 'Backup finished' toast has appeared"
gets.chomp
puts "extracting..."
`dd if=data.ab bs=1 skip=24 | openssl zlib -d | tar -xvf -`

для запуска → ruby ​​your_ruby_file_name.rb

Этот script только "счастливый путь", поэтому убедитесь, что ваше устройство подключено и что adb добавлен в ваш профиль.

0

Основываясь на ответе, данном Lam Vinh, вот простой командный файл, который работает для меня в моем первом гене Nexus 7. Он предлагает пользователю ввести имя пакета и имя базы данных (без расширения .sqlite) и помещает его в c:\temp. Предполагается, что у вас установлен Android sdk в переменных среды.

@echo off
cd c:\temp\

set /p UserInputPackage= Enter the package name: 
set /p UserInputDB= Enter the database name: 

@echo on
adb shell "run-as %UserInputPackage% chmod 666 /data/data/%UserInputPackage%/databases/%UserInputDB%.sqlite"
adb pull /data/data/%UserInputPackage%/databases/%UserInputDB%.sqlite
@echo off
pause
0

На корневом устройстве вы можете:

// check that db is there
>adb shell
# ls /data/data/app.package.name/databases
db_name.sqlite // a custom named db
# exit
// pull it
>adb pull /data/app.package.name/databases/db_name.sqlite
  • 0
    Я не уверен на 100%, но я думаю, прежде чем тянуть нужно> Су и дать разрешение
0
 > is it possible to pull in any way a database of an Android device without having to root it? 

да, если ваше приложение для Android создает копию файла базы данных, доступную для всех.

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

-2

Если вы хотите, чтобы ваш файл базы данных

См. DDMS > Просмотр файла

найдите свой db файл из вашего имени пакета

затем щелкните по извлечению файла с устройства (только укорененное устройство)

  • 3
    это можно сделать, но на рутированном устройстве, что является вопросом моего вопроса, как это сделать на некорневом устройстве
  • 1
    это не работает на некорневом устройстве. Ваш ответ должен заявить, что.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню