Android – Pulling SQlite database android device

The question:

I’ve looked everywhere and i can’t find a real precise answer or a tutorial on how, if it is possible, to do this.

is it possible to pull in any way a database of an Android device without having to root it? i just need to extract that data in any way in order to gather it on my pc, so how can i perform this? do i have to reprogram the app or whatever method you guys know about, but remember without rooting the device. thanks

The Solutions:

Below are the methods you can try. The first solution is probably the best. Try others if the first one doesn’t work. Senior developers aren’t just copying/pasting – they read the methods carefully & apply them wisely to each case.

Method 1

If your device is running Android v4 or above, you can pull app data, including it’s database, without root by using adb backup command, then extract the backup file and access the sqlite database.

First backup app data to your PC via USB cable with the following command, replace with the actual package name of the application.

adb backup -f ~/data.ab -noapk

This will prompt you to “unlock your device and confirm the backup operation”. Do not provide a password for backup encryption, so you can extract it later. Click on the “Back up my data” button on your device. The screen will display the name of the package you’re backing up, then close by itself upon successful completion.

The resulting data.ab file in your home folder contains application data in android backup format. To extract it use the following command:

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

If the above ended with openssl:Error: 'zlib' is an invalid command. error, try the below.

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

The result is the apps/ folder containing application data, including sqlite database.

For more details you can check the original blog post.

Method 2

A common way to achieve what you desire is to use the ADB pull command.

Another way I prefer in most cases is to copy the database by code to SD card:

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());
} catch (Exception e) {


Don’t forget to set the permission to write on SD in your manifest, like below.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Method 3

For debuggable apps1 on non-rooted devices, you could use following command:

adb shell run-as chmod 666 /data/data/
adb pull /data/data/


adb shell run-as chmod 666 /data/data/
adb pull /data/data/

Set PATH adb for Enviroment Variables or use cd command to android sdk folder platform-tools.


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

then use above command

1 Note that most apps in Play store are not debuggable since it requires setting the debuggable flag in the manifest.

Method 4

Most of the answers here are way more complicated than they have to be. If you just want to copy the database of your app from your phone to your computer then you just need this command:

adb -d shell "run-as cat databases/" > target.sqlite

All you need to fill in in the above command is the package name of your app, what the database is called and optionally what/where you want the database to be copied to.

Please note that this specific command will only work if you have only one device connected to your computer. The -d parameter means that the only connected device will be targeted. But there are other parameters which you can use instead:

  • -e will target the only running emulator
  • -s <serialnumber> will target a device with a specific serial number.

Method 5

Using Android Studio 3.0 or later version it is possible to pull database (also shared preference, cache directory and others) if application runs in debug mode on non-rooted device.

To pull database using android studio follow these steps.

  1. Click View > Tool Windows > Device File Explorer.
  2. Expand /data/data/[package-name] nodes.

Steps followed in Android Studio 3.0

Method 6

 adb shell "run-as [] chmod -R 777 /data/data/[]/databases" 
 adb shell "mkdir -p /sdcard/tempDB" 
 adb shell "cp -r /data/data/[]/databases/ /sdcard/tempDB/." 
 adb pull sdcard/tempDB/ . 
 adb shell "rm -r /sdcard/tempDB/*"

Method 7

For Ubuntu (not only?):

see Sergeis Answer but instead of openssl use zlib-flate:

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

Otherwise openssl will probably throw:

openssl:Error: ‘zlib’ is an invalid command.

because openssl is not compiled with zlib support in Ubuntu

Method 8

Since, nothing really work for me. I create a little windows BATCH script based on other answers combined together. Hope it help somebody. Simply usage: backupDatabase < PackageName > < ApplicationName > [TargetDirectory].
It use Sergei’s backup method and 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 TARGET_DIR=%cd%
IF NOT "%~3"=="" set TARGET_DIR=%3

set PATH_ADB="c:Program Files (x86)Androidandroid-studiosdkplatform-tools"
set PATH_ABE="c:Programsandroid-backup-extractor-20140630-bin"
set PATH_7Z="c:Program Files7-Zip"

@echo Processing: backup

@echo Processing: unpack

@echo Processing: extract

@echo Processing: cleaning
goto :eof

@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.Uses: - ADB backup (set PATH_ADB)
@echo.      - Android Backup Extractor ( (set PATH_ABE)
@echo.      - Extract TAR container, uses 7z (set PATH_7Z)
@echo.Usage: backupDatabase ^<PackageName^> ^<ApplicationName^> [TargetDirectory]
@echo.Example: backupDatabase ExampleApp 
@echo Example: backupDatabase ExampleApp workspaceAndroidProjectsExample
exit /B 1

Method 9

If you are trying to do it on android 6 request the permission and use the code of the answer of this question

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

Once it is granted

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

Method 10

Alternatively you can use my library Ultra Debugger. It’s allow to download database as file or edit values directly in browser. No root needed, very easy to use.

Method 11

On Mac (NO root required)

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

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

It will copy the sqlite file in platform-tools folder.

Method 12

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

yes if your android app creates a file copy of the database that is accessable by everyone.

android protects apps private data so it is not visible/accessable by other apps. a database is private data.
your app can of course read the database-file so it can do a file-copy to some public visible file.

Method 13

On a rooted device you can:

// check that db is there
>adb shell
# ls /data/data/
db_name.sqlite // a custom named db
# exit
// pull it
>adb pull /data/

Method 14

Based on the answer given by Lam Vinh, here is a simple batch file that works for me on my 1st gen Nexus 7. It prompts the user to enter the package name and then the database name (without the .sqlite extension) and puts it in c:temp. This assumes you have the Android sdk set in the environment variables.

@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

Method 15

If you are on Android 4.0 or above, and you are on a mac, then here is a ruby script that will save your app contents to the desktop. I would imagine this would also work in Ubuntu, though I didn’t test it.

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"
puts "extracting..."
`dd if=data.ab bs=1 skip=24 | openssl zlib -d | tar -xvf -`

to run -> ruby your_ruby_file_name.rb

This script is “happy path” only, so please make sure your device is connected and that adb has been added to your profile.

Method 16

you can easily extract the sqlite file from your device(root no necessary)

  1. Go to SDK Folder
  2. cd platform-tools
  3. start adb

    cd /sdk/platform-tools
    ./adb shell

    Then type in the following command in terminal

    ./adb -d shell “run-as com.your_packagename cat /data/data/com.your_packagename/databases/jokhanaNepal > /sdcard/jokhana.sqlite”

    For eg

    ./adb -d shell “run-as cat /data/data/ > /sdcard/jokhana.sqlite”

Method 17

I give the complete solution to “save” and “restore” the app database to/from the internal storage (not to the PC with adb).

I have done two methods one for save and other for restore the database. Use these methods at the end of the onCreate() in MainActivity (one or the other if you want to saver or restore the database).

save database to internal storage:

void copyDatabase (){
        try {
            final String inFileName = "/data/data/<>/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 = > 0) {
                output.write(buffer, 0, length);

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

restore database from internal storage:

void restoreDatabase (){
        try {
            final String inFileName = Environment.getExternalStorageDirectory() + "database_backup.db";
            final String outFileName = "/data/data/<>/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 = > 0) {
                output.write(buffer, 0, length);

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

Method 18

It is always better if things are automated.That’s why I wrote simple python script for copying db file from device using ADB. It saves a lot of development time if you’re doing it frequently.

Works only with debuggable apps if device is Not rooted.

Here is link to the gist.

Run it as : python

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

        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"

    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

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

        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("nn","")

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]
        else :
            print 'Please select in range'
    else : 
        print 'Not valid input'

elif numberofDevices == 1 :
elif numberofDevices == 0 :
    print("No device is attached")

Method 19

If you want your database file

See the DDMS > File explore

find your db file from your package name

then Click on pull a file from device (Rooted device only)

All methods was sourced from or, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Comment