Jeśli Twoja aplikacja wymaga bazy danych i zawiera wbudowane dane, jaki jest najlepszy sposób wysłania tej aplikacji? Czy powinienem:
Utwórz bazę danych SQLite i umieść ją w
.apk
?Dołącz do aplikacji polecenia SQL i czy ma ona utworzyć bazę danych i wstawić dane przy pierwszym użyciu?
Wady, które widzę to:
Możliwe niedopasowania wersji SQLite mogą powodować problemy, a obecnie nie wiem, dokąd powinna iść baza danych i jak uzyskać do niej dostęp.
Utworzenie i zapełnienie bazy danych na urządzeniu może zająć naprawdę dużo czasu.
Jakieś sugestie? Bardzo mile widziane byłyby wskazówki dotyczące dokumentacji dotyczące wszelkich problemów.
android
android-sqlite
android-database
Heikki Toivonen
źródło
źródło
Odpowiedzi:
Istnieją dwie opcje tworzenia i aktualizowania baz danych.
Jednym z nich jest utworzenie bazy danych zewnętrznie, następnie umieszczenie jej w folderze zasobów projektu, a następnie skopiowanie z niej całej bazy danych. Jest to znacznie szybsze, jeśli baza danych zawiera wiele tabel i innych składników. Aktualizacje są uruchamiane przez zmianę numeru wersji bazy danych w pliku res / wartości / strings.xml. Uaktualnienia byłyby wówczas realizowane przez zewnętrzne tworzenie nowej bazy danych, zastępowanie starej bazy danych w folderze zasobów nową bazą danych, zapisywanie starej bazy danych w pamięci wewnętrznej pod inną nazwą, kopiowanie nowej bazy danych z folderu zasobów do pamięci wewnętrznej, przenoszenie wszystkich danych ze starej bazy danych (której wcześniej zmieniono nazwę) na nową bazę danych i na koniec usuwając starą bazę danych. Możesz utworzyć bazę danych oryginalnie za pomocąWtyczka FireFox Menedżera SQLite do wykonywania instrukcji tworzenia SQL.
Inną opcją jest utworzenie bazy danych wewnętrznie z pliku sql. Nie jest to tak szybkie, ale opóźnienie byłoby prawdopodobnie niezauważalne dla użytkowników, jeśli baza danych ma tylko kilka tabel. Aktualizacje są uruchamiane przez zmianę numeru wersji bazy danych w pliku res / wartości / strings.xml. Uaktualnienia byłyby wtedy realizowane przez przetwarzanie pliku sql aktualizacji. Dane w bazie danych pozostaną niezmienione, z wyjątkiem przypadków usunięcia kontenera, na przykład upuszczenia tabeli.
Poniższy przykład pokazuje, jak użyć jednej z metod.
Oto przykładowy plik create_database.sql. Należy go umieścić w folderze zasobów projektu dla metody wewnętrznej lub skopiować do „Wykonaj SQL” SQLite Managera, aby utworzyć bazę danych dla metody zewnętrznej (UWAGA: Zwróć uwagę na komentarz dotyczący tabeli wymaganej przez system Android).
Oto przykładowy plik update_database.sql. Należy go umieścić w folderze zasobów projektu dla metody wewnętrznej lub skopiować do „Wykonaj SQL” SQLite Managera, aby utworzyć bazę danych dla metody zewnętrznej (UWAGA: Zauważ, że wszystkie trzy typy komentarzy SQL zostaną zignorowane przez parser sql, który jest zawarty w tym przykładzie).
Oto wpis, który należy dodać do pliku /res/values/strings.xml dla numeru wersji bazy danych.
Oto działanie, które uzyskuje dostęp do bazy danych, a następnie z niej korzysta. ( Uwaga: możesz użyć kodu bazy danych w osobnym wątku, jeśli używa on wielu zasobów ).
Oto klasa pomocnicza bazy danych, w której baza danych jest tworzona lub aktualizowana w razie potrzeby. (UWAGA: Android wymaga utworzenia klasy rozszerzającej SQLiteOpenHelper w celu pracy z bazą danych Sqlite).
Oto klasa FileHelper, która zawiera metody kopiowania plików bajtów i analizowania plików SQL.
źródło
SQLiteAssetHelper
Biblioteka sprawia, że to zadanie bardzo proste.Łatwo jest dodać jako zależność stopniową (ale Jar jest również dostępny dla Ant / Eclipse), a wraz z dokumentacją można go znaleźć na stronie :
https://github.com/jgilfelt/android-sqlite-asset-helper
Uwaga: Ten projekt nie jest już obsługiwany, jak podano powyżej w linku Github.
Jak wyjaśniono w dokumentacji:
Dodaj zależność do pliku kompilacji stopni modułu:
Skopiuj bazę danych do katalogu zasobów, w podkatalogu o nazwie
assets/databases
. Na przykład:assets/databases/my_database.db
(Opcjonalnie możesz skompresować bazę danych w pliku zip, takim jak
assets/databases/my_database.zip
. Nie jest to konieczne, ponieważ plik APK jest już skompresowany jako całość.)Utwórz klasę, na przykład:
źródło
Moje rozwiązanie nie używa żadnej biblioteki innej firmy ani nie zmusza cię do wywoływania niestandardowych metod w
SQLiteOpenHelper
podklasie w celu zainicjowania bazy danych podczas tworzenia. Zajmuje się również aktualizacjami baz danych. Wszystko, co należy zrobić, to podklasęSQLiteOpenHelper
.Warunek wstępny:
android_metadata
z atrybutemlocale
mającym wartośćen_US
oprócz tabel unikalnych dla Twojej aplikacji.Podklasa
SQLiteOpenHelper
:SQLiteOpenHelper
.private
metodę w ramachSQLiteOpenHelper
podklasy. Ta metoda zawiera logikę kopiowania zawartości bazy danych z pliku bazy danych w folderze „resources” do bazy danych utworzonej w kontekście pakietu aplikacji.onCreate
,onUpgrade
aonOpen
metodySQLiteOpenHelper
.Wystarczająco powiedziane. Oto
SQLiteOpenHelper
podklasa:Na koniec, aby uzyskać połączenie z bazą danych, wystarczy zadzwonić
getReadableDatabase()
lubgetWritableDatabase()
naSQLiteOpenHelper
podklasy i będzie dbać o tworzenie db, kopiowanie zawartości db z określonego pliku w folderze „aktywa”, jeśli baza danych nie istnieje.Krótko mówiąc, można użyć
SQLiteOpenHelper
podklasy, aby uzyskać dostęp do bazy danych dostarczonej w folderze zasobów, tak jak w przypadku bazy danych inicjowanej przy użyciu zapytań SQL wonCreate()
metodzie.źródło
Wysyłanie aplikacji z plikiem bazy danych w Android Studio 3.0
Wysyłanie aplikacji z plikiem bazy danych to dla mnie dobry pomysł. Zaletą jest to, że nie trzeba wykonywać skomplikowanej inicjalizacji, która czasem kosztuje dużo czasu, jeśli zestaw danych jest ogromny.
Krok 1: Przygotuj plik bazy danych
Przygotuj plik bazy danych. Może to być plik .db lub .sqlite. Jeśli używasz pliku .sqlite, wszystko, co musisz zrobić, to zmienić nazwy rozszerzeń plików. Kroki są takie same.
W tym przykładzie przygotowałem plik o nazwie testDB.db. Ma jedną tabelę i niektóre przykładowe dane w ten sposób
Krok 2: Zaimportuj plik do swojego projektu
Utwórz folder zasobów, jeśli jeszcze go nie masz. Następnie skopiuj i wklej plik bazy danych do tego folderu
Krok 3: Skopiuj plik do folderu danych aplikacji
Musisz skopiować plik bazy danych do folderu danych aplikacji, aby móc z nim dalej współpracować. Jest to jednorazowe działanie (inicjowanie) w celu skopiowania pliku bazy danych. Jeśli wywołasz ten kod wiele razy, plik bazy danych w folderze danych zostanie zastąpiony plikiem w folderze zasobów. Ten proces nadpisywania jest przydatny, gdy chcesz zaktualizować bazę danych w przyszłości podczas aktualizacji aplikacji.
Pamiętaj, że podczas aktualizacji aplikacji ten plik bazy danych nie zostanie zmieniony w folderze danych aplikacji. Tylko odinstalowanie go usunie.
Plik bazy danych należy skopiować do
/databases
folderu. Otwórz Eksplorator plików urządzenia. Wpiszdata/data/<YourAppName>/
lokalizację. Jest to domyślny folder danych aplikacji wspomniany powyżej. Domyślnie plik bazy danych zostanie umieszczony w innym folderze o nazwie bazy danych w tym kataloguTeraz proces kopiowania plików jest podobny do tego, co robi Java. Użyj poniższego kodu, aby wykonać kopiowanie wklej. To jest kod inicjujący. Można go również wykorzystać do aktualizacji (nadpisania) pliku bazy danych w przyszłości.
Następnie odśwież folder, aby zweryfikować proces kopiowania
Krok 4: Utwórz pomocnika otwartej bazy danych
Utwórz podklasę dla
SQLiteOpenHelper
, z połączeniem, zamknij, ścieżką itp. Nazwałem jąDatabaseOpenHelper
Krok 5: Utwórz klasę najwyższego poziomu do interakcji z bazą danych
Będzie to klasa odczytująca i zapisująca plik bazy danych. Istnieje również przykładowe zapytanie do wydrukowania wartości w bazie danych.
Krok 6: Uruchomienie testowe
Przetestuj kod, uruchamiając następujące wiersze kodów.
Naciśnij przycisk Run i dopinguj!
źródło
W listopadzie 2017 r. Google wydało bibliotekę Room Persistence Library .
Z dokumentacji:
Baza danych Room ma wywołanie zwrotne, gdy baza danych jest tworzona lub otwierana po raz pierwszy. Możesz użyć wywołania zwrotnego tworzenia, aby zapełnić bazę danych.
Kod z tego postu na blogu .
źródło
Z tego, co widziałem, powinieneś wysyłać bazę danych z już skonfigurowanymi tabelami i danymi. Jednak jeśli chcesz (w zależności od rodzaju aplikacji), możesz zezwolić na „opcję aktualizacji bazy danych”. Następnie pobierz najnowszą wersję sqlite, pobierz najnowsze instrukcje wstawiania / tworzenia pliku tekstowego hostowanego online, wykonaj instrukcje i wykonaj transfer danych ze starej bazy danych do nowej.
źródło
W końcu to zrobiłem !! Skorzystałem z tej pomocy linku Korzystanie z własnej bazy danych SQLite w aplikacjach na Androida , ale musiałem ją nieco zmienić.
Jeśli masz wiele pakietów, umieść tutaj nazwę pakietu głównego:
private static String DB_PATH = "data/data/masterPakageName/databases";
Zmieniłem metodę kopiowania bazy danych z folderu lokalnego do folderu emulatora! Miał problem, gdy ten folder nie istniał. Przede wszystkim powinien sprawdzić ścieżkę, a jeśli jej nie ma, powinien utworzyć folder.
W poprzednim kodzie
copyDatabase
metoda nigdy nie została wywołana, gdy baza danych nie istniała, acheckDataBase
metoda spowodowała wyjątek. więc trochę zmieniłem kod.Jeśli twoja baza danych nie ma rozszerzenia pliku, nie używaj z nim nazwy pliku.
działa dla mnie ładnie, mam nadzieję, że przyda ci się również
źródło
Obecnie nie ma możliwości wstępnego utworzenia bazy danych SQLite w celu dostarczenia z aplikacją. Najlepsze, co możesz zrobić, to zapisać odpowiedni kod SQL jako zasób i uruchomić go z aplikacji. Tak, prowadzi to do powielania danych (ta sama informacja istnieje jako zapas i baza danych), ale obecnie nie ma innej możliwości. Jedynym czynnikiem ograniczającym zagrożenie jest skompresowanie pliku apk. Moje doświadczenie to kompresje 908 KB do mniej niż 268 KB.
W poniższym wątku znajduje się najlepsza dyskusja / rozwiązanie, jakie znalazłem z dobrym przykładowym kodem.
http://groups.google.com/group/android-developers/msg/9f455ae93a1cf152
Przechowałem moją instrukcję CREATE jako zasób ciągów do odczytu za pomocą Context.getString () i uruchomiłem ją za pomocą SQLiteDatabse.execSQL ().
Przechowałem dane dla moich insertów w res / raw / inserts.sql (stworzyłem plik sql, ponad 7000 linii). Używając techniki z powyższego linku wszedłem w pętlę, czytałem plik linia po linii i skonkatenowałem dane do „INSERT INTO tbl VALUE” i wykonałem kolejną SQLiteDatabase.execSQL (). Nie ma sensu oszczędzać 7000 „WSTAWIĆ WARTOŚĆ tbl”, kiedy można je po prostu zawrzeć.
Emulator zajmuje około dwudziestu sekund, nie wiem, jak długo potrwa to na prawdziwym telefonie, ale zdarza się to tylko raz, gdy użytkownik uruchamia aplikację po raz pierwszy.
źródło
INSERT INTO table VALUES(...) VALUES(...) VALUES(...) ...
(1 wiersz wkładki powinien mieć 100 WARTOŚCI). Będzie znacznie wydajniejszy i skróci czas uruchamiania z 20 do 2 lub 3 sekund.Wysłanie bazy danych wewnątrz apk, a następnie skopiowanie jej do
/data/data/...
podwoi rozmiar bazy danych (1 w apk, 1 wdata/data/...
) i zwiększy rozmiar apk (oczywiście). Twoja baza danych nie powinna być zbyt duża.źródło
Android zapewnia już podejście do zarządzania bazami danych z uwzględnieniem wersji. Takie podejście zostało zastosowane w ramach BARACUS dla aplikacji na Androida.
Umożliwia zarządzanie bazą danych w całym cyklu życia wersji aplikacji, umożliwiając aktualizację bazy danych sqlite z dowolnej poprzedniej wersji do bieżącej.
Pozwala także na uruchamianie kopii zapasowych na gorąco i przywracanie SQLite na gorąco.
Nie jestem w 100% pewien, ale odzyskiwanie na gorąco dla konkretnego urządzenia może umożliwić wysłanie przygotowanej bazy danych w aplikacji. Ale nie jestem pewien co do formatu binarnego bazy danych, który może być specyficzny dla niektórych urządzeń, dostawców lub generacji urządzeń.
Ponieważ jest to licencja Apache 2, możesz ponownie użyć dowolnej części kodu, którą można znaleźć na github
EDYTOWAĆ :
Jeśli chcesz tylko wysyłać dane, możesz rozważyć utworzenie i utrwalenie POJO przy pierwszym uruchomieniu aplikacji. BARACUS ma wbudowaną obsługę tego (Wbudowany magazyn wartości kluczy dla informacji o konfiguracji, np. „APP_FIRST_RUN” plus zaczep po ładowaniu po kontekście w celu uruchomienia operacji po uruchomieniu w kontekście). Umożliwia to przesyłanie ściśle powiązanych danych z aplikacją; w większości przypadków pasuje to do moich przypadków użycia.
źródło
Jeśli wymagane dane nie są zbyt duże (limity, których nie znam, zależą od wielu rzeczy), możesz również pobrać dane (w formacie XML, JSON, cokolwiek) ze strony internetowej / aplikacji internetowej. Po otrzymaniu uruchom instrukcje SQL, używając otrzymanych danych, tworząc tabele i wstawiając dane.
Jeśli Twoja aplikacja mobilna zawiera dużo danych, później może być łatwiej zaktualizować dane w zainstalowanych aplikacjach o dokładniejsze dane lub zmiany.
źródło
Zmodyfikowałem klasę i odpowiedzi na pytanie i napisałem klasę, która pozwala aktualizować bazę danych za pomocą DB_VERSION.
Korzystanie z klasy.
W klasie aktywności zadeklaruj zmienne.
W metodzie onCreate napisz następujący kod.
Jeśli dodasz plik bazy danych do folderu res / raw, użyj następującej modyfikacji klasy.
http://blog.harrix.org/article/6784
źródło
Napisałem bibliotekę, aby uprościć ten proces.
Stworzy bazę danych z
assets/databases/myDb.db
pliku. Ponadto otrzymasz wszystkie te funkcje:Sklonuj go z github .
źródło
Używam ORMLite i poniższy kod działał dla mnie
Uwaga: Kod wyodrębnia plik bazy danych z pliku zip w zasobach
źródło