Wenn Ihre Anwendung eine Datenbank benötigt und integrierte Daten enthält, wie kann diese Anwendung am besten ausgeliefert werden? Sollte ich:
Erstellen Sie die SQLite-Datenbank vor und fügen Sie sie in das
.apk
?Fügen Sie die SQL-Befehle in die Anwendung ein und lassen Sie sie die Datenbank erstellen und die Daten bei der ersten Verwendung einfügen?
Die Nachteile, die ich sehe, sind:
Mögliche Nichtübereinstimmungen der SQLite-Version können Probleme verursachen, und ich weiß derzeit nicht, wohin die Datenbank gehen soll und wie ich darauf zugreifen soll.
Das Erstellen und Auffüllen der Datenbank auf dem Gerät kann sehr lange dauern.
Irgendwelche Vorschläge? Hinweise auf die Dokumentation zu Problemen sind sehr willkommen.
android
android-sqlite
android-database
Heikki Toivonen
quelle
quelle
Antworten:
Es gibt zwei Möglichkeiten zum Erstellen und Aktualisieren von Datenbanken.
Eine besteht darin, eine Datenbank extern zu erstellen, sie dann im Assets-Ordner des Projekts abzulegen und dann die gesamte Datenbank von dort zu kopieren. Dies ist viel schneller, wenn die Datenbank viele Tabellen und andere Komponenten enthält. SQLite Manager FireFox-Plugin zum Ausführen Ihrer SQL-Erstellungsanweisungen.Upgrades werden durch Ändern der Datenbankversionsnummer in der Datei res / values / strings.xml ausgelöst. Upgrades werden dann durchgeführt, indem eine neue Datenbank extern erstellt, die alte Datenbank im Assets-Ordner durch die neue Datenbank ersetzt, die alte Datenbank im internen Speicher unter einem anderen Namen gespeichert, die neue Datenbank aus dem Assets-Ordner in den internen Speicher kopiert und alle übertragen werden der Daten aus der alten Datenbank (die zuvor umbenannt wurde) in die neue Datenbank und schließlich das Löschen der alten Datenbank. Sie können eine Datenbank ursprünglich mithilfe von erstellen
Die andere Möglichkeit besteht darin, eine Datenbank intern aus einer SQL-Datei zu erstellen. Dies ist nicht so schnell, aber die Verzögerung wäre für die Benutzer wahrscheinlich nicht wahrnehmbar, wenn die Datenbank nur wenige Tabellen enthält. Upgrades werden durch Ändern der Datenbankversionsnummer in der Datei res / values / strings.xml ausgelöst. Upgrades würden dann durch Verarbeiten einer Upgrade-SQL-Datei durchgeführt. Die Daten in der Datenbank bleiben unverändert, außer wenn der Container entfernt wird, z. B. wenn eine Tabelle gelöscht wird.
Das folgende Beispiel zeigt, wie beide Methoden verwendet werden.
Hier ist ein Beispiel für die Datei create_database.sql. Es muss im Assets-Ordner des Projekts für die interne Methode abgelegt oder in "SQL ausführen" von SQLite Manager kopiert werden, um die Datenbank für die externe Methode zu erstellen. (HINWEIS: Beachten Sie den Kommentar zu der von Android benötigten Tabelle.)
Hier ist eine Beispieldatei update_database.sql. Es muss im Assets-Ordner des Projekts für die interne Methode abgelegt oder in "SQL ausführen" von SQLite Manager kopiert werden, um die Datenbank für die externe Methode zu erstellen. (HINWEIS: Beachten Sie, dass alle drei Arten von SQL-Kommentaren ignoriert werden durch den in diesem Beispiel enthaltenen SQL-Parser.)
Hier ist ein Eintrag, der der Datei /res/values/strings.xml für die Datenbankversionsnummer hinzugefügt werden kann.
Hier ist eine Aktivität, die auf die Datenbank zugreift und diese dann verwendet. ( Hinweis: Möglicherweise möchten Sie den Datenbankcode in einem separaten Thread ausführen, wenn er viele Ressourcen verwendet. )
Hier ist die Datenbank-Hilfsklasse, in der die Datenbank bei Bedarf erstellt oder aktualisiert wird. (HINWEIS: Für Android müssen Sie eine Klasse erstellen, die SQLiteOpenHelper erweitert, um mit einer SQLite-Datenbank arbeiten zu können.)
Hier ist die FileHelper-Klasse, die Methoden zum Kopieren von Byte-Stream-Dateien und zum Parsen von SQL-Dateien enthält.
quelle
Die
SQLiteAssetHelper
Bibliothek macht diese Aufgabe wirklich einfach.Es ist einfach, es als Gradle-Abhängigkeit hinzuzufügen (aber ein Jar ist auch für Ant / Eclipse verfügbar). Zusammen mit der Dokumentation finden Sie es unter:
https://github.com/jgilfelt/android-sqlite-asset-helper
Hinweis: Dieses Projekt wird nicht mehr wie oben unter Github-Link angegeben gepflegt.
Wie in der Dokumentation erläutert:
Fügen Sie die Abhängigkeit zur Gradle-Build-Datei Ihres Moduls hinzu:
Kopieren Sie die Datenbank in das Assets-Verzeichnis in einem Unterverzeichnis namens
assets/databases
. Zum Beispiel:assets/databases/my_database.db
(Optional können Sie die Datenbank in einer Zip-Datei wie z
assets/databases/my_database.zip
. Dies ist nicht erforderlich, da die APK bereits als Ganzes komprimiert ist.)Erstellen Sie eine Klasse, zum Beispiel:
quelle
Meine Lösung verwendet weder eine Bibliothek eines Drittanbieters noch zwingt sie Sie, benutzerdefinierte Methoden für die
SQLiteOpenHelper
Unterklasse aufzurufen , um die Datenbank bei der Erstellung zu initialisieren. Es kümmert sich auch um Datenbank-Upgrades. Alles, was getan werden muss, ist eine UnterklasseSQLiteOpenHelper
.Voraussetzung:
android_metadata
mit einem Attribut enthaltenlocale
, das den Werten_US
zusätzlich zu den für Ihre App eindeutigen Tabellen enthält.Unterklasse
SQLiteOpenHelper
:SQLiteOpenHelper
.private
Methode innerhalb derSQLiteOpenHelper
Unterklasse. Diese Methode enthält die Logik zum Kopieren von Datenbankinhalten aus der Datenbankdatei im Ordner "Assets" in die im Anwendungspaketkontext erstellte Datenbank.onCreate
,onUpgrade
undonOpen
MethodenSQLiteOpenHelper
.Genug gesagt. Hier geht die
SQLiteOpenHelper
Unterklasse:Um eine Datenbankverbindung herzustellen, rufen Sie einfach
getReadableDatabase()
odergetWritableDatabase()
aufSQLiteOpenHelper
Unterklasse auf und es wird , die den Datenbankinhalt aus der angegebenen Datei im Ordner "Assets" kopiert, wenn die Datenbank nicht vorhanden ist.Kurz gesagt, Sie können die
SQLiteOpenHelper
Unterklasse verwenden, um auf die im Assets-Ordner gelieferte Datenbank zuzugreifen, genau wie Sie es für eine Datenbank verwenden würden, die mithilfe von SQL-Abfragen in deronCreate()
Methode initialisiert wird.quelle
Versand der App mit einer Datenbankdatei in Android Studio 3.0
Der Versand der App mit einer Datenbankdatei ist für mich eine gute Idee. Der Vorteil ist, dass Sie keine komplexe Initialisierung durchführen müssen, was manchmal viel Zeit kostet, wenn Ihr Datensatz sehr groß ist.
Schritt 1: Bereiten Sie die Datenbankdatei vor
Halten Sie Ihre Datenbankdatei bereit. Dies kann entweder eine DB-Datei oder eine SQLite-Datei sein. Wenn Sie eine .sqlite-Datei verwenden, müssen Sie lediglich die Namen der Dateierweiterungen ändern. Die Schritte sind die gleichen.
In diesem Beispiel habe ich eine Datei namens testDB.db vorbereitet. Es enthält eine Tabelle und einige Beispieldaten
Schritt 2: Importieren Sie die Datei in Ihr Projekt
Erstellen Sie den Assets-Ordner, falls Sie noch keinen hatten. Kopieren Sie dann die Datenbankdatei und fügen Sie sie in diesen Ordner ein
Schritt 3: Kopieren Sie die Datei in den Datenordner der App
Sie müssen die Datenbankdatei in den Datenordner der App kopieren, um weitere Interaktionen mit ihr durchführen zu können. Dies ist eine einmalige Aktion (Initialisierung) zum Kopieren der Datenbankdatei. Wenn Sie diesen Code mehrmals aufrufen, wird die Datenbankdatei im Datenordner von der Datei im Assets-Ordner überschrieben. Dieser Überschreibvorgang ist nützlich, wenn Sie die Datenbank in Zukunft während des App-Updates aktualisieren möchten.
Beachten Sie, dass diese Datenbankdatei während des App-Updates nicht im Datenordner der App geändert wird. Nur durch Deinstallieren wird es gelöscht.
Die Datenbankdatei muss in einen
/databases
Ordner kopiert werden . Öffnen Sie den Gerätedateie-Explorer. Ort eingebendata/data/<YourAppName>/
. Dies ist der oben erwähnte Standarddatenordner der App. Standardmäßig wird die Datenbankdatei in einem anderen Ordner namens "Datenbanken" unter diesem Verzeichnis abgelegtDer Prozess zum Kopieren von Dateien ähnelt dem von Java. Verwenden Sie den folgenden Code, um das Kopieren und Einfügen durchzuführen. Dies ist der Initiationscode. Es kann auch verwendet werden, um die Datenbankdatei in Zukunft zu aktualisieren (durch Überschreiben).
Aktualisieren Sie dann den Ordner, um den Kopiervorgang zu überprüfen
Schritt 4: Erstellen Sie einen Helfer zum Öffnen einer Datenbank
Erstellen Sie eine Unterklasse für
SQLiteOpenHelper
, mit connect, close, path usw. Ich habe sie benanntDatabaseOpenHelper
Schritt 5: Erstellen Sie eine Klasse der obersten Ebene für die Interaktion mit der Datenbank
Dies ist die Klasse, die Ihre Datenbankdatei liest und schreibt. Außerdem gibt es eine Beispielabfrage, um den Wert in der Datenbank auszudrucken.
Schritt 6: Testlauf
Testen Sie den Code, indem Sie die folgenden Codezeilen ausführen.
Drücke den Run-Button und feuere an!
quelle
Im November 2017 veröffentlichte Google die Room Persistence Library .
Aus der Dokumentation:
Die Raumdatenbank hat einen Rückruf, wenn die Datenbank zum ersten Mal erstellt oder geöffnet wird. Sie können den Rückruf erstellen verwenden, um Ihre Datenbank zu füllen.
Code aus diesem Blog-Beitrag .
quelle
Nach allem, was ich gesehen habe, sollten Sie eine Datenbank versenden, in der die Tabellen und Daten bereits eingerichtet sind. Wenn Sie möchten (und abhängig von der Art Ihrer Anwendung), können Sie jedoch die Option "Datenbank aktualisieren" zulassen. Anschließend laden Sie die neueste SQLite-Version herunter, rufen die neuesten Insert / Create-Anweisungen einer online gehosteten Textdatei ab, führen die Anweisungen aus und führen eine Datenübertragung von der alten zur neuen Datenbank durch.
quelle
Endlich habe ich es gemacht!! Ich habe diese Link- Hilfe verwendet, um Ihre eigene SQLite-Datenbank in Android-Anwendungen zu verwenden , musste sie jedoch ein wenig ändern.
Wenn Sie viele Pakete haben, sollten Sie hier den Namen des Master-Pakets eingeben:
private static String DB_PATH = "data/data/masterPakageName/databases";
Ich habe die Methode geändert, mit der die Datenbank vom lokalen Ordner in den Emulatorordner kopiert wird! Es gab ein Problem, als dieser Ordner nicht existierte. Zunächst sollte der Pfad überprüft werden, und wenn er nicht vorhanden ist, sollte der Ordner erstellt werden.
Im vorherigen Code wurde die
copyDatabase
Methode nie aufgerufen, wenn die Datenbank nicht vorhanden war und diecheckDataBase
Methode eine Ausnahme verursachte. Also habe ich den Code ein wenig geändert.Wenn Ihre Datenbank keine Dateierweiterung hat, verwenden Sie den Dateinamen nicht mit einer.
es funktioniert gut für mich, ich hoffe es wäre auch nützlich für dich
quelle
Derzeit gibt es keine Möglichkeit, eine SQLite-Datenbank für den Versand mit Ihrer apk vorab zu erstellen. Das Beste, was Sie tun können, ist, das entsprechende SQL als Ressource zu speichern und von Ihrer Anwendung aus auszuführen. Ja, dies führt zu doppelten Daten (dieselben Informationen existieren als Resrouce und als Datenbank), aber es gibt derzeit keinen anderen Weg. Der einzige mildernde Faktor ist, dass die APK-Datei komprimiert ist. Meine Erfahrung ist, dass 908 KB auf weniger als 268 KB komprimiert werden.
Der folgende Thread hat die beste Diskussion / Lösung, die ich mit gutem Beispielcode gefunden habe.
http://groups.google.com/group/android-developers/msg/9f455ae93a1cf152
Ich habe meine CREATE-Anweisung als Zeichenfolgenressource gespeichert, die mit Context.getString () gelesen werden soll, und sie mit SQLiteDatabse.execSQL () ausgeführt.
Ich habe die Daten für meine Einfügungen in res / raw / inserts.sql gespeichert (ich habe die SQL-Datei mit mehr als 7000 Zeilen erstellt). Mit der Technik aus dem obigen Link habe ich eine Schleife eingegeben, die Datei Zeile für Zeile gelesen und die Daten auf "INSERT INTO tbl VALUE" zusammengefasst und eine weitere SQLiteDatabase.execSQL () ausgeführt. Es macht keinen Sinn, 7000 "INSERT IN tbl VALUE" zu speichern, wenn sie nur auf konzentriert werden können.
Auf dem Emulator dauert es ungefähr zwanzig Sekunden. Ich weiß nicht, wie lange dies auf einem echten Telefon dauern würde, aber es passiert nur einmal, wenn der Benutzer die Anwendung zum ersten Mal startet.
quelle
INSERT INTO table VALUES(...) VALUES(...) VALUES(...) ...
(1 Einfügungszeile sollte 100 WERTE haben). Es ist viel effizienter und reduziert Ihre Startzeit von 20 Sekunden auf 2 oder 3 Sekunden.Wenn Sie die Datenbank innerhalb der apk versenden und dann in kopieren,
/data/data/...
wird die Größe der Datenbank verdoppelt (1 in apk, 1 indata/data/...
) und die apk-Größe (natürlich) erhöht. Ihre Datenbank sollte also nicht zu groß sein.quelle
Android bietet bereits einen versionierungsorientierten Ansatz für die Datenbankverwaltung. Dieser Ansatz wurde im BARACUS-Framework für Android-Anwendungen genutzt.
Sie können die Datenbank über den gesamten Versionslebenszyklus einer App verwalten und so die SQLite-Datenbank von jeder früheren Version auf die aktuelle Version aktualisieren.
Außerdem können Sie Hot-Backups und Hot-Recovery von SQLite ausführen.
Ich bin nicht 100% sicher, aber eine Hot-Recovery für ein bestimmtes Gerät kann es Ihnen ermöglichen, eine vorbereitete Datenbank in Ihrer App zu versenden. Ich bin mir jedoch nicht sicher, welches Datenbank-Binärformat für bestimmte Geräte, Anbieter oder Gerätegenerationen spezifisch sein kann.
Da es sich um Apache License 2 handelt, können Sie jeden Teil des Codes, der auf github zu finden ist, wiederverwenden
BEARBEITEN:
Wenn Sie nur Daten versenden möchten, können Sie POJOs beim ersten Start der Anwendung instanziieren und beibehalten. BARACUS hat eine integrierte Unterstützung dafür (integrierter Schlüsselwertspeicher für Konfigurationsinfos, z. B. "APP_FIRST_RUN" plus einen Bootstrap-Hook nach dem Kontext, um Operationen nach dem Start für den Kontext auszuführen). Auf diese Weise können Sie eng gekoppelte Daten mit Ihrer App versenden lassen. In den meisten Fällen passte dies zu meinen Anwendungsfällen.
quelle
Wenn die erforderlichen Daten nicht zu groß sind (Grenzen, die ich nicht kenne, hängen von vielen Dingen ab), können Sie die Daten auch (in XML, JSON usw.) von einer Website / Webanwendung herunterladen. Führen Sie nach dem Empfang die SQL-Anweisungen mit den empfangenen Daten aus, erstellen Sie Ihre Tabellen und fügen Sie die Daten ein.
Wenn Ihre mobile App viele Daten enthält, ist es möglicherweise später einfacher, die Daten in den installierten Apps mit genaueren Daten oder Änderungen zu aktualisieren.
quelle
Ich habe die Klasse und die Antworten auf die Frage geändert und eine Klasse geschrieben, mit der die Datenbank über DB_VERSION aktualisiert werden kann.
Eine Klasse benutzen.
Deklarieren Sie in der Aktivitätsklasse Variablen.
Schreiben Sie in der onCreate-Methode den folgenden Code.
Wenn Sie dem Ordner res / raw eine Datenbankdatei hinzufügen, verwenden Sie die folgende Änderung der Klasse.
http://blog.harrix.org/article/6784
quelle
Ich habe eine Bibliothek geschrieben , um diesen Prozess zu vereinfachen.
Es wird eine Datenbank aus einer
assets/databases/myDb.db
Datei erstellt. Darüber hinaus erhalten Sie alle diese Funktionen:Klonen Sie es von Github .
quelle
Ich verwende ORMLite und der folgende Code hat für mich funktioniert
Bitte beachten Sie, dass der Code die Datenbankdatei aus einer Zip-Datei in Assets extrahiert
quelle