Debugowanie bazy danych sqlite na urządzeniu

98

Obecnie pracuję nad aplikacją WiFi na Androida. Mam problem z uzyskaniem dostępu do bazy danych na urządzeniu. Debugowanie w emulatorze u mnie nie działa, ponieważ w emulatorze nie ma obsługi WiFi. Próbowałem wyciągnąć plik bazy danych z urządzenia za pomocą

adb pull data/data/package-name/databases/database-name

Ale pojawia się błąd „Odmowa uprawnień”. W tej odpowiedzi Android: Gdzie są przechowywane pliki bazy danych? , Commonsware zasugerowało pobranie pliku bazy danych przez uruchomienie w trybie debugowania. Ale to też nie działa. Jakakolwiek pomoc dotycząca debugowania bazy danych bez rootowania urządzenia byłaby bardzo mile widziana.

Pierwotny Pappachan
źródło

Odpowiedzi:

142

Powtórzę się z innej odpowiedzi :

Począwszy od poziomu API 8 (Android 2.2), jeśli zbudujesz aplikację jako debugowalną, możesz użyć run-aspolecenia powłoki, aby uruchomić polecenie lub plik wykonywalny jako określony użytkownik / aplikacja lub po prostu przełączyć się na UIDaplikację, aby uzyskać dostęp do jej danych informator.

Jeśli więc chcesz pobrać bazę danych aplikacji z urządzenia, uruchom kompilację debugowania aplikacji, połącz się adb shelli uruchom następujące polecenie:

run-as com.yourpackage sh -c "cat ~/databases/db-file" > /sdcard/db-file.sqlite

Spowoduje to skopiowanie db-filedo katalogu głównego karty SD / pamięci zewnętrznej. Teraz możesz łatwo uzyskać to stamtąd za pomocą menedżera plików adb pulllub czegokolwiek innego. Pamiętaj, że przy takim podejściu NIE ma potrzeby, aby Twoja aplikacja miałaWRITE_EXTERNAL_STORAGE uprawnienia, ponieważ kopiowanie jest wykonywane przez użytkownika powłoki, który zawsze może pisać do pamięci zewnętrznej.

W systemach Linux / Mac istnieje możliwość skopiowania bazy danych bezpośrednio na komputer za pomocą następującego polecenia, którego można użyć bez wchodzenia do powłoki adb:

adb shell 'run-as com.yourpackage sh -c "cat ~/databases/db-file"' > db-file.sqlite

To jednak nie będzie działać poprawnie w systemie Windows z powodu konwersji symboli CR / LF. Użyj tam poprzedniej metody.

Idolon
źródło
1
@MikeIsrael Na wszelki wypadek nie używasz SQLCipher w swojej aplikacji, prawda? Jeśli nie, to aby z grubsza sprawdzić, czy baza danych została poprawnie pobrana, otwórz plik DB w przeglądarce (najlepiej w przeglądarce hex) i sprawdź, czy zaczyna się od SQLite format 3łańcucha. Upewnij się również, że masz poprawną sqlitewersję (tj. Nie próbujesz otworzyć bazy danych sqlite3 za pomocą pliku wykonywalnego sqlite2). Możesz także wypróbować innych klientów SQLite (na przykład SQLiteStudio ). Mam nadzieję, że to pomoże.
Idolon,
1
Mam problem z jedną wkładką. Działa dobrze, jeśli uruchomię polecenie w powłoce, ale jeśli wstawię jedną otrzymaną linijkę: System nie może znaleźć określonej ścieżki.
Rev Tyler
2
pakiet <mój pakiet> jest nieznany ... każdy wie dlaczego. Zainstalowałem przez studio, naciskając przycisk debugowania.
Nathan Schwermann
4
Na Androidzie Lollipop dostajępermission denied
Muhammad Babar,
1
Wyciągnąłem bazę danych z dwiema tabelami i kilkunastoma wierszami w każdej i wykonałem pełne zapytania wybierające w każdej tabeli. Jeden działał dobrze, drugi zgłosił błąd danych w pliku. W tej chwili moje najlepsze przypuszczenie to niedopasowanie kodowania między systemem Android a powłoką lokalną.
Mason
23

Używam tego skryptu powłoki na moim MAC, który kopiuje bazę danych bezpośrednio do mojego folderu domowego. Łatwe rozwiązanie jednym kliknięciem, wystarczy zmienić nazwę pakietu (com.example.app) i nazwę bazy danych (database.sqlite)

Prosty skrypt

#!/bin/bash
adb -d shell 'run-as com.example.app cat /data/data/com.example.app/databases/database.sqlite > /sdcard/database.sqlite'
adb pull /sdcard/database.sqlite ~/

Skrypt, który akceptuje argumenty [nazwa_pakietu] [baza danych]

#!/bin/bash

REQUIRED_ARGS=2
ADB_PATH=/Users/Tadas/Library/sdk/platform-tools/adb
PULL_DIR="~/"

if [ $# -ne $REQUIRED_ARGS ]
    then
        echo ""
        echo "Usage:"
        echo "android_db_move.sh [package_name] [db_name]"
        echo "eg. android_db_move.sh lt.appcamp.impuls impuls.db"
        echo ""
    exit 1
fi;


echo""

cmd1="$ADB_PATH -d shell 'run-as $1 cat /data/data/$1/databases/$2 > /sdcard/$2' "
cmd2="$ADB_PATH pull /sdcard/$2 $PULL_DIR"

echo $cmd1
eval $cmd1
if [ $? -eq 0 ]
    then
    echo ".........OK"
fi;

echo $cmd2
eval $cmd2

if [ $? -eq 0 ]
    then
    echo ".........OK"
fi;

exit 0
Tadas Valaitis
źródło
Pierwszym poleceniem było utworzenie zerobajtowej
romulof
14

Najlepszym sposobem przeglądania bazy danych aplikacji na Androida i zarządzania nią jest użycie tej biblioteki https://github.com/sanathp/DatabaseManager_For_Android

Dzięki tej bibliotece możesz zarządzać bazą danych SQLite aplikacji z poziomu samej aplikacji. możesz przeglądać tabele w bazie danych aplikacji, aktualizować, usuwać, wstawiać wiersze do tabel. Wszystko z aplikacji.

Jest to pojedynczy plik aktywności java, po prostu dodaj plik java do folderu źródłowego. Po zakończeniu tworzenia usuń plik java z folderu src i to wszystko.

Bardzo mi to pomogło. Mam nadzieję, że tobie też pomoże.

Możesz obejrzeć 1-minutowe demo tutaj: http://youtu.be/P5vpaGoBlBY

sanath_p
źródło
11

Chociaż jest to stare pytanie, myślę, że nadal jest aktualne i zasługuje na obecną odpowiedź. Dostępne są narzędzia, które pozwalają na bezpośrednie przeglądanie baz danych (bez konieczności ściągania ich z urządzenia lub emulatora).

Narzędziem, które ostatnio odkryłem (i najbardziej lubię) jest Android Debug Database .

Musisz tylko dodać tę zależność:

debugImplementation 'com.amitshekhar.android:debug-db:1.0.3'

Nie jest wymagany żaden dodatkowy kod. Po uruchomieniu aplikacji otwórz logcat i filtruj dla „DebugDB”, a zobaczysz komunikat z informacją

D/DebugDB: Open http://192.168.178.XXX:8080 in your browser

Działa z każdą przeglądarką i możesz sprawdzić tabele bazy danych i wspólne preferencje.

wprowadź opis obrazu tutaj

Działa również z emulatorami domyślnymi i Genymotion.


Narzędzie, którego użyłem wcześniej, to stetho .

Wada: musisz dodać trochę kodu i jesteś powiązany z przeglądarką Chrome.

Zaleta: Masz również możliwość sprawdzenia ruchu sieciowego.

Peter F.
źródło
5

Jeśli dostaniesz

The system cannot find the path specified.

próbować

adb -d shell "run-as com.yourpackage cat /data/data/com.yourpackage/databases/dbname.sqlite > /sdcard/dbname.sqlite"

Zwróć uwagę na podwójny cudzysłów!

Gerold Meisinger
źródło
3

Po prostu zrobiłem:

$ adb shell
shell@android:/ $ run-as myapp.package.name sh
shell@android:/data/data/myapp.package.name $

Następnie mogę debugować bazę danych sqlite lub cokolwiek chcę zrobić z powłoki z odpowiednimi uprawnieniami.

smichak
źródło
2

Jeśli apk można debugować, istnieje sposób, aby użyć programu o nazwie run-as z (innej niż root) powłoki adb, aby skopiować prywatny plik aplikacji.

Chris Stratton
źródło
2

Oto instrukcje krok po kroku - w większości zaczerpnięte z kombinacji innych odpowiedzi. Działa to z urządzeniami, które nie są odblokowane.

  1. Podłącz urządzenie i uruchom aplikację w trybie debugowania.

  2. Skopiuj plik bazy danych z folderu aplikacji na kartę SD: wykonaj:

    ./adb -d shell 'run-as com.yourpackge.name cat /data/data/com.yourpackge.name/databases/filename.sqlite> /sdcard/filename.sqlite'

  3. Pobierz pliki bazy danych na swój komputer: wykonaj:

    ./adb pull / sdcard / execute: ./adb

  4. Zainstaluj Firefox SQLLite Manager: https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/

  5. Otwórz Firefox SQLLite Manager i otwórz plik bazy danych z kroku 3 powyżej.

  6. Cieszyć się!

Andy Cochrane
źródło
2

Android Studio 4.1 Dodano nową funkcję przeglądania / edycji baz danych Android SQLite.

wprowadź opis obrazu tutaj

Jak otworzyć Inspektora bazy danych

Aby otworzyć Inspektora bazy danych w Android Studio, musisz wybrać View > Tool Windows > Database Inspector z paska menu.

Musisz także uruchomić aplikację na urządzeniu z poziomem API 26 lub wyższym.

Za pomocą tego narzędzia możesz

  • Przeszukuj swoje bazy danych

  • Modyfikuj i debuguj swoją bazę danych

wprowadź opis obrazu tutaj

Darish
źródło
2

W nowym Android Studio 4.1 jest nowy Inspektor bazy danych .

https://developer.android.com/studio/preview/features/images/database-inspector.gif

Z paska menu możesz wybrać następujące opcje, View > Tool Windows > Database Inspectoraby go otworzyć. Bardziej szczegółowe instrukcje można znaleźć na tym blogu .

Innym sposobem jest użycie do tego stetho . Dodajesz zależność, a następnie możesz użyć narzędzi Chrome DevTools (chrome: // inspect), aby sprawdzić bazę danych, gdy urządzenie jest podłączone.

jeprubio
źródło
1

Musisz uruchomić adb jako root lub używać go na zrootowanym telefonie.

Aby uruchomić adb jako root, użyj adb root

Zobacz także: Dlaczego podczas korzystania z adb otrzymuję odmowę dostępu do folderu danych?

Malfist
źródło
Próbowałem tego. Ale daje mi to „adb nie może działać jako root w kompilacjach produkcyjnych”
Primal Pappachan
Musisz go uruchomić w trybie debugowania.
Malfist
Zobacz to: mydroidworld.com/forums/android-hacks/… Jeśli używasz go na telefonie, a nie na emulatorze, musisz go zrootować .
Malfist
Uruchomiłem aplikację w trybie debugowania i wypróbowałem również powyższe kroki. To nie działa.
Primal Pappachan
Działa to tylko dla emulatora lub zrootowanego urządzenia.
slott
1

Żadne z rozwiązań typu run-as-i-cat-to-sdcard nie działało dla mnie na Androidzie 4.4.2. Nie jestem pewien, ale podejrzewam, że może to być spowodowane run-asnieprawidłową obsługą nowego narzędzia sdcard_risdcard_rw uprawnień.

Najpierw musiałem skopiować plik bazy danych do /filesprywatnej pamięci wewnętrznej mojej aplikacji:

shell@hammerhead:/ $ run-as com.example.myapp   
shell@hammerhead:/data/data/com.example.myapp $ cp databases/mydb files/mydb

Następnie skopiowałem do /sdcard/Android/data/com.example.myapp/filesw Javaland (to wymaga WRITE_EXTERNAL_STORAGEpozwolenia):

public class MainActivity extends BaseActivity {

    @Override
     protected void onCreate(Bundle savedInstanceState) {
         ...

         if (isExternalStorageWritable()) {
             final FileInputStream input;
             try {
                 input = openFileInput("mydb");

                 File output = new File(getExternalFilesDir(null), "mydb");

                 copy(input, output);
             } catch (FileNotFoundException e) {
                 e.printStackTrace();
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
     }

     public void copy(FileInputStream in, File dst) throws IOException {
         OutputStream out = new FileOutputStream(dst);

         // Transfer bytes from in to out
         byte[] buf = new byte[1024];
         int len;
         while ((len = in.read(buf)) > 0) {
             out.write(buf, 0, len);
         }
         in.close();
         out.close();
     }

     public boolean isExternalStorageWritable() {
         String state = Environment.getExternalStorageState();
         return Environment.MEDIA_MOUNTED.equals(state);
     }
 }

Na koniec skopiowałem plik na laptopa:

$ adb pull /sdcard/Android/data/com.example.myapp/files/mydb
user167019
źródło
1
Jest prostsze rozwiązanie. Jeśli zmodyfikujesz 777 swój plik sqlite, a następnie wyjdziesz z run-as, pozwoli ci to skopiować go do / sdcard jako zwykłego użytkownika.
zedix
1

Moje urządzenie nie miało sdcard

więc pierwsze rozwiązanie nie zadziałało dla mnie.

Jeśli masz podobny problem, spróbuj tego:

  adb shell "run-as package chmod 777 /data/data/package/databases/yourdb.sqlite";
  adb pull /data/data/package/databases/yourdb.sqlite
dsharew
źródło
/sdcardniekoniecznie jest to karta SD. Na moim telefonie wskazuje na pamięć wewnętrzną, gdy nie ma fizycznej karty SD.
DearVolt,
0

Wypróbuj tę aplikację: SQLiteWeb ( https://play.google.com/store/apps/details?id=br.com.cm.sqliteweb ). Zapewnia zdalny dostęp do bazy danych bez jej wyciągania.

W wersji płatnej ma uprawnienia roota do prywatnej bazy danych (/ data / data / nazwa-pakietu ...) lub implementuje dostawcę treści do łączenia się za pomocą SQLiteWeb (instrukcje wewnątrz aplikacji)

Ale jeśli chcesz pozostać przy darmowej wersji, możesz utworzyć swoją bazę danych w pamięci zewnętrznej:

database = SQLiteDatabase.openDatabase(Environment.getExternalStorageDirectory()
        + "/" + DATABASE_NAME, null, DATABASE_VERSION);
Cesar Morigaki
źródło
0

W OSX, używając odpowiedzi @Tadas z automatorem i sqllitebrowser ( https://github.com/sqlitebrowser/sqlitebrowser ):

  1. otwórz Automator i utwórz nowy przepływ pracy.

  2. dodaj akcję „Uruchom skrypt powłoki”.

  3. Wklej to:

    source ~ / .bash_profile adb shell 'run-as cat /data/data/your_app_uid/databases/db.name> /tmp/db.name' adb pull /tmp/db.name ~ / open -a sqlitebrowser ~ / db. imię

  4. kliknij Uruchom, aby odświeżyć bazę danych w sqlitebrowser.

Zaster
źródło
0
  1. Otwórz terminal
  2. cd <ANDROID_SDK_PATH>(dla mnie w systemie Windows cd C:\Users\Willi\AppData\Local\Android\sdk)
  3. cd platform-tools
  4. adb shell (działa to tylko wtedy, gdy działa tylko jeden emulator)
  5. cd data/data
  6. su (uzyskaj uprawnienia superużytkownika)
  7. cd <PACKAGE_NAME>/databases
  8. sqlite3 <DB_NAME>
  9. wydaje instrukcje SQL ( ważne: zakończ je ;, w przeciwnym razie instrukcja nie zostanie wydana i zamiast tego zostanie przerwana na nowy wiersz).

Uwaga: Użyj ls(Linux) lub dir(Windows), jeśli chcesz wyświetlić zawartość katalogu.

Willi Mentzel
źródło