Jak sprawdzić bazę danych na nie zakorzenione urządzenie z Androidem

Rozwijam aplikację, w której używam bazy danych sqllite3 do przechowywania wartości. Mam Nexus S I Nexus 7 oba są nierooted urządzeń. Jak Mogę uzyskać bazę danych dla mojej aplikacji w celu debugowania.

Próbowałem (1) próbowałem wszystkich podejść wymienionych tutaj

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

Tu jest napisane 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 
Author: CodingRat, 2013-07-26

11 answers

Możesz zapisać swoją bazę danych do pamięci zewnętrznej za pomocą:

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

Gdzie DB_NAME jest nazwą mojej bazy danych, a DB_PATH jest zdefiniowane w następujący sposób:

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/";
    }

I dodaj następujące pozwolenie (dzięki @Sathesh za zwrócenie na to uwagi):

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

Wywołuję tę metodę za każdym razem, gdy mam zapis bazy danych, aby mój najbardziej aktualny plik bazy danych był w pamięci zewnętrznej i mogę go przeglądać i debugować stamtąd.

Następnie można użyć X-Plore aplikacji aby przeglądaj bazę danych z pamięci zewnętrznej bezpośrednio na urządzeniu z systemem Android.

 30
Author: TronicZomB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-30 13:09:44

Poniższe rozwiązanie działa tylko dla aplikacji, które można debugować. Może to nie działać dobrze na wszystkich urządzeniach, ponieważ polecenie run-as nie działa na niektórych urządzeniach, szczególnie z Jelly Bean.

  1. Utwórz *.plik bat i skopiuj następujące Skrypty

    Adb shell run-as [pakiet] chmod 777 / data / data/[pakiet] / bazy danych /

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

    Adb shell run-as [pakiet] cp / data/data/[pakiet]/bazy danych /[db_file_name]/sdcard /

    ADB pull / sdcard/[db_file_name]

  2. Zmień [pakiet] na żądany pakiet aplikacji

  3. Zmień [db_file_name] na żądaną nazwę db uruchom plik bat i skopiowana baza danych powinna znajdować się w tym samym folderze co The bat plik

Powyższe rozwiązanie zakłada:

  • pracujesz na Windows
  • urządzenie jest podłączone i widoczne pod "urządzenia adb"
 36
Author: kmalmur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-28 12:24:14

Jeśli nie znasz ścieżki aplikacji, możesz użyć tego:

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

Lub jeśli potrzebujesz skopiować bazę danych do publicznego folderu "Pobierz", możesz użyć tego:

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();
    }
}
To działa idealnie na moim urządzeniu Nexus 4.
 10
Author: mr.boyfox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-09 15:32:17

Oto bardzo prosta i prosta odpowiedź: (testowane na Android one: unrooted )

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

Teraz przeciągnij bazę danych do domyślnej ścieżki adb

adb -d pull /sdcard/mydatabase.db

Lub na pulpit np.

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

Możesz usunąć kopię poleceniem poniżej:

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

-d opcja wybiera domyślne urządzenie, jeśli posiada więcej niż jeden emulator.

 10
Author: kolunar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-17 15:04:09

Po prostu musiałam zrobić coś takiego i jest na to sposób, chociaż to ból. Musisz zakatalogować plik jako konto użytkownika aplikacji, a następnie skierować go do zapisywalnej lokalizacji. U mnie to działało na moim Nexusie 4 działającym 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
 3
Author: Ted Mielczarek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-28 18:21:01

Spróbuj użyć biblioteki stetho opracowanej przez facebook, umożliwia przeglądanie db za pomocą przeglądarki internetowej https://facebook.github.io/stetho/

 3
Author: rAm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-16 12:11:56
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/

W Xamrinie.forms I had to replace databases to files

 0
Author: Massimo Alvaro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-20 14:54:37

Jeśli po uruchomieniu

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

Otrzymujesz "run-as: Pakiet "your.package.name' is unknown", następnie spróbuj pobrać bazę danych z emulatora. Zobacz tutaj: https://stackoverflow.com/a/44089632/2914140

W Android Studio 3.0 kliknij Widok > Narzędzia Windows > Eksplorator plików urządzeń. Rozwiń węzły /data/data/[Nazwa pakietu].

 0
Author: CoolMind,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-25 16:47:14

Myślę, że to najprostszy sposób. Dodaj tę zależność do pliku gradle: debugImplementation ' com.amitshekhar.android: debug-db: 1.0.0 '

Po tym, kiedy uruchomisz aplikację w konsoli, zobaczysz komunikat: D / DebugDB: Open http://192.168.1.114:8080 w Twojej przeglądarce

I jest twoja baza danych.

 0
Author: f.trajkovski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-10 15:29:39

Nie możesz uzyskać dostępu do folderu / data na urządzeniu nie zakorzenionym

Nie ma na to sposobu. Android ma świetne mechanizmy bezpieczeństwa. Tylko Twoja aplikacja ma dostęp do własnych plików.

 -2
Author: TN888,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-26 14:09:24

Nie jest to możliwe z telefonu nie zakorzenionego. Nie możesz uzyskać dostępu do katalogu /data, więc nie możesz kopiować bazy danych ani używać aplikacji SQLite jak w (2). Jeśli chcesz debugować, użyj symulatora lub uruchom zapytania w aplikacji, aby sprawdzić bazę danych.

 -2
Author: Samuel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-26 14:09:29