How to check database on not rooted android device

2019-01-08 08:25发布

问题:

I am developing an app where i am using sqllite3 database to store values. I have Nexus S and Nexus 7 both are unrooted devices. How can i get the database for my app for debugging purpose.

I have tried (1) I have tried all approach mentioned here

adb shell
run-as app.package.name \
cp /data/data/package.name/databases/application.sqlite /sdcard/
exit
adb pull /sdcard/application.sqlite ~/

This says cp not found..

(2) http://developer.android.com/tools/help/adb.html#sqlite

adb -s emulator-5554 shell
# sqlite3 /data/data/com.example.google.rss.rssexample/databases/rssitems.db
SQLite version 3.3.12
Enter ".help" for instructions
.... enter commands, then quit...
sqlite> .exit 

回答1:

You can write your database to the external memory with the following:

private void writeToSD() throws IOException {
    File sd = Environment.getExternalStorageDirectory();

    if (sd.canWrite()) {
        String currentDBPath = DB_NAME;
        String backupDBPath = "backupname.db";
        File currentDB = new File(DB_PATH, 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();
        }
    }
}

Where DB_NAME is the name of my database and DB_PATH is defined as follows:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        DB_PATH = context.getFilesDir().getAbsolutePath().replace("files", "databases") + File.separator;
    }
    else {
        DB_PATH = context.getFilesDir().getPath() + context.getPackageName() + "/databases/";
    }

And add the following permission (Thanks to @Sathesh for pointing this out):

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

I call this method anytime I have a database write so that my most current database file is in the external memory and I can view it and debug from there.

Then you can use the X-Plore app to view the database from the external memory right on the Android device.



回答2:

The following solution works only for apps that are debuggable. It may not work well on all devices, since ​​run-as command doesn't work on some devices, especially with Jelly Bean.

  1. ​Create a *.bat file and copy the following scripts ​​

    adb shell run-as [package] chmod 777 /data/data/[package]/databases/

    adb shell run-as [package] chmod 777 /data/data/[package]/databases/[db_file_name]

    adb shell run-as [package] cp /data/data/[package]/databases/[db_file_name] /sdcard/

    adb pull /sdcard/[db_file_name]

  2. ​Change [package] to the desired application package

  3. Change [db_file_name] to the desired db name Run the bat file and you should see the copied database in the same folder as the bat file

The above solution assumes:

  • You are working on Windows
  • The device is connected and visible under "adb devices"


回答3:

If you don't know your application path then you can use this:

public void copyAppDbToExternalStorage() throws IOException {
    File sd = Environment.getExternalStorageDirectory();
    File currentDB = getApplicationContext().getDatabasePath("databaseName"); //databaseName=your current application database name, for example "my_data.db"
    if (sd.canWrite()) {
        File backupDB = new File(sd, "toDatabaseName"); // for example "my_data_backup.db"
        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();
        }
    }
}

Or if you need copy database to public "Download" folder then you can use this:

public void copyAppDbToDownloadFolder() throws IOException {
    File backupDB = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "toDatabaseName"); // for example "my_data_backup.db"
    File currentDB = getApplicationContext().getDatabasePath("databaseName"); //databaseName=your current application database name, for example "my_data.db"
    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();
    }
}

This is working perfectly on my Nexus 4 device.



回答4:

Here's a much simple and straightforward answer: (Tested on Android one: unrooted)

adb -d shell 
$ run-as my.package.name
$ cp databases/mydatabase.db /sdcard/mydatabase.db
$ exit
$ exit

now pull your database to the default adb path

adb -d pull /sdcard/mydatabase.db

or, to your Desktop for e.g.

adb -d pull /sdcard/mydatabase.db C:\Users\user\Desktop

you may want to remove the copy with a command below:

adb -d shell "rm /sdcard/mydatabase.db"

-d option chooses the default device if having more than one emulator.



回答5:

I just had to do something like this and there is a way to do it, although it's a pain. You need to cat the file as the application's user account, and then pipe it to a writable location. This worked for me on my Nexus 4 running 4.3.3:

adb shell "run-as org.your.application cat /data/data/org.your.application/your-file > /mnt/sdcard/your-file"
adb pull /mnt/sdcard/your-file


回答6:

Try using stetho Library developed by facebook , it enables you to view the db via the web browser https://facebook.github.io/stetho/



回答7:

adb shell "run-as CHR.Droid chmod 666 /data/data/CHR.Droid/files/CHR.db"
adb shell cp /data/data/CHR.Droid/files/CHR.db /sdcard/

In Xamrin.forms I had to replace databases to files



回答8:

If after running

adb shell "run-as your.package.name"

you receive "run-as: Package 'your.package.name' is unknown", then try to get a database from emulator. See here: https://stackoverflow.com/a/44089632/2914140

In Android Studio 3.0 click View > Tool Windows > Device File Explorer. Expand /data/data/[package-name] nodes.



回答9:

I think that this is the easiest way. Add this dependency to your gradle file: debugImplementation 'com.amitshekhar.android:debug-db:1.0.0'

After this when you will start your application in your console you can see the message: D/DebugDB: Open http://192.168.1.114:8080 in your browser

And there is your database.



回答10:

You cannot access /data folder on not-rooted device

There is no way to do that. Android has great security mechanisms. Only your app can access its own files.



回答11:

It isn't possible from a non-rooted phone. You cannot access the /data directory, so you can't copy the database or use sqlite app as in (2). If you need to debug, use the simulator, or from your app run queries to inspect the database.