Android-вытягивание SQLite базы данных android устройства



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



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

1049   20  

20 ответов:

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

другой способ, который я предпочитаю в большинстве случаев, это скопировать базу данных по коду на 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" />

если ваше устройство работает под управлением 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.

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

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

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

установите путь adb для переменных окружающей среды или используйте команду cd для Android sdk folder platform-tools.

пример:

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

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


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

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

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

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

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

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

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

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

  1. клик посмотреть>Инструмент Windows>Device File Explorer.
  2. расширения / data / data/[имя пакета] узлы.

Steps followed in Android Studio 3.0

 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/*"

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

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

cat appbackup.ab | (dd bs=24 count=0 skip=1; cat) / zlib-flate -распаковать > appbackup.тар

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

openssl: Error:' zlib ' является недопустимой командой.

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

так, ничего не работает для меня. Я создаю небольшой пакетный скрипт windows, основанный на других ответах, объединенных вместе. Надеюсь, это поможет кому-то. Просто использование: backupDatabase [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-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%z.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

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

  1. перейдите в папку SDK
  2. cd platform-tools
  3. start adb

    cd / sdk / platform-tools ./АБР оболочки

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

    ./ 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.ювии.приложение cat / data / data / com.ювии.приложение / базы данных /jokhanaNepal > /sdcard / jokhana.базы данных SQLite"

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

на Mac (не требуется корень)

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.

 > is it possible to pull in any way a database of an Android device without having to root it? 

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

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

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

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

на основе ответа, данного Lam Vinh, вот простой пакетный файл, который работает для меня на моем 1-м поколении 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

Если вы находитесь на Android 4.0 или выше, и вы находитесь на mac, то вот скрипт ruby, который сохранит содержимое вашего приложения на рабочем столе. Я бы предположил, что это также будет работать в 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.РБ

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

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

как получить доступ к не корневой 4.2 файловой системы телефона android по ssh от ubuntu 16.04

Если вы пытаетесь сделать это на 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();
        } 
    } 
} 

Я даю полное решение для "сохранения" и "восстановления" базы данных приложения в/из внутреннего хранилища (не на ПК с 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");
        }
    }

всегда лучше, если все автоматизировано.Вот почему я написал просто python script для копирования файла БД с устройства с помощью ADB. Это экономит много времени на разработку, если вы делаете это часто.

работает только с отлаживаемого приложения если устройство не укоренены.

вот ссылка на Гист.

запустить его как : python copyandroiddbfile.py

import sys
import subprocess
import re

#/
# Created by @nieldeokar on 25/05/2018.
#/

# 1. Python script which will copy database file of debuggable apps from the android device to your computer using ADB.
# 2. This script ask for PackageName and DatabaseName at runtime.
# 3. You can make it static by passing -d at as command line argument while running script and setting defaults in following way.
# 4. Edit script and change the values of varialbe packageName and dbName to debuggable app package name and database name then
# run script as : python Copydbfileandroid.py -d 

useDefaults = False


def checkIfPackageInstalled(strSelectedDevice) :

    packageName = 'com.nileshdeokar.healthapp.debug'
    dbName = 'healthapp.db'


    if not useDefaults : 
        print('Please enter package name : ')
        packageName = raw_input()

    packageString = 'package:'+packageName

    try:
        adbCheckIfPackageInstalledOutput = subprocess.check_output('adb -s ' + strSelectedDevice + ' shell pm list packages | grep -x '+ packageString, shell=True)
    except subprocess.CalledProcessError as e:
                print "Package not found"
                return


    if packageString.strip() == adbCheckIfPackageInstalledOutput.strip() : 
        if not useDefaults : 
            print('Please enter db name : ')
            dbName = raw_input()

        adbCopyDbString = 'adb -s '+strSelectedDevice + ' -d shell \"run-as '+packageName+' cat /data/data/'+packageName+'/databases/'+ dbName +'\" > '+dbName

        try:
            copyDbOp = subprocess.check_output(adbCopyDbString,shell=True)
        except subprocess.CalledProcessError as e:
                return

        if "is not debuggable" in copyDbOp :
            print packageString + 'is nto debuggable'

        if copyDbOp.strip() == "":
            print 'Successfully copied '+dbName + ' in current directory'

    else :
        print 'Package is not installed on the device'



defaultString = "-d"
if len(sys.argv[1:]) > 0 and sys.argv[1] == defaultString :
        useDefaults = True

listDevicesOutput = subprocess.check_output("adb devices", shell=True)
listDevicesOutput = listDevicesOutput.replace("List of devices attached"," ").replace("\n","").replace("\t","").replace("\n\n","")

numberofDevices = len(re.findall(r'device+', listDevicesOutput))

connectedDevicesArray = listDevicesOutput.split("device")   
del connectedDevicesArray[-1] 


strSelectedDevice = ''
if(numberofDevices > 1) :
    print('Please select the device : \n'),

    for idx, device in enumerate(connectedDevicesArray):
        print idx+1,device

    selectedDevice = raw_input()

    if selectedDevice.isdigit() :
        intSelected = int(selectedDevice)
        if 1 <= intSelected <= len(connectedDevicesArray) :
            print 'Selected device is : ',connectedDevicesArray[intSelected-1]
            checkIfPackageInstalled(connectedDevicesArray[intSelected-1])
        else :
            print 'Please select in range'
    else : 
        print 'Not valid input'

elif numberofDevices == 1 :
    checkIfPackageInstalled(connectedDevicesArray[0])
elif numberofDevices == 0 :
    print("No device is attached")

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

смотрите DDMS > file explore

найти файл БД из вашего имени пакета

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

Comments

    Ничего не найдено.