Vor- und Nachteile von SQLite und gemeinsamen Einstellungen [geschlossen]


155

Was ist der gute Mechanismus zum Speichern von Informationen zwischen SQLite-Datenbanken und freigegebenen Einstellungen?

Warum gemeinsame Einstellungen verwenden? Warum SQLite verwenden? Ich habe versucht, den Unterschied zwischen ihnen zu finden, und dies ist der bessere Mechanismus für die Datenspeicherung, aber ich kann bei Google keine passende Antwort finden. Bitte helfen Sie mir mit Beispiel und Erklärungen.


Es hängt ziemlich stark von der Art der Daten ab, die Sie speichern möchten. SharedPreferences ermöglicht einen schnelleren und einfacheren Zugriff auf Daten. Die Verwendung ist einfacher, wenn kleine Datenmengen gespeichert werden.
Egor

2
Speichern Sie nichts in freigegebenen Einstellungen außer einfachen Zeichenfolgen und Grundelementen - und wenn Sie für jede Datei eine separate Datei verwenden - trotz der Dokumente sind freigegebene Einstellungen nicht threadsicher und selbst wenn sie nur für den Hauptthread verwendet werden, der extrem anfällig für Beschädigungen ist, sollten Sie mehr speichern als 1 Schlüsselwertpaar in einer Datei.
RunLoop

SharedPreferences werden nach der ersten Verwendung im Speicher zwischengespeichert, daher sollten sie bei nachfolgenden Leseverwendungen ziemlich schnell sein.
Stan

Antworten:


167

Es hängt wirklich von den Daten ab, die Sie speichern möchten.

SQLite

Große Mengen derselben strukturierten Daten sollten in einer SQLite-Datenbank gespeichert werden, da Datenbanken für diese Art von Daten ausgelegt sind. Da die Daten von der Datenbank strukturiert und verwaltet werden, kann sie mithilfe einer Abfragesprache wie SQL abgefragt werden, um eine Teilmenge der Daten abzurufen, die bestimmten Kriterien entspricht. Dies ermöglicht die Suche in den Daten. Das Verwalten und Durchsuchen großer Datenmengen beeinflusst natürlich die Leistung, sodass das Lesen von Daten aus einer Datenbank langsamer sein kann als das Lesen von Daten aus SharedPreferences.

Gemeinsame Einstellungen

SharedPreferences ist ein Schlüssel- / Wertspeicher, in dem Sie Daten unter einem bestimmten Schlüssel speichern können. Um die Daten aus dem Geschäft zu lesen, müssen Sie den Schlüssel der Daten kennen. Dies macht das Lesen der Daten sehr einfach. So einfach es ist, eine kleine Datenmenge zu speichern, so schwierig ist es, große strukturierte Daten zu speichern und zu lesen, wie Sie den Schlüssel für jede einzelne Daten definieren müssen. Außerdem können Sie nicht wirklich innerhalb der Daten suchen, es sei denn, Sie haben ein bestimmtes Konzept für Benennung der Schlüssel.


24
Zum Beispiel sind SharedPreferences nützlich zum Speichern von Benutzereinstellungen, bei denen nur eine Handvoll Variablen gespeichert werden müssen. SQLite hingegen ist besser zum Speichern von Daten geeignet, bei denen eine große Anzahl von Elementen vorhanden ist, z. B. Songtitel in einer Musikbibliothek, die durchsucht werden müssen.
CL22

5
Sie müssen die Schlüsselnamen nicht kennen, um SharedPreferences verwenden zu können. Siehe getAll ().
ZaBlanc

5
Zu Ihrer Information, es gibt eine DRITTE Option: XML in eine Datei lesen / schreiben. (Siehe android.util.xml Klassen). Geeignet für mäßig komplexe Daten, die auf einmal gelesen / geschrieben werden können. Beispiel: Ein Wertegitter, das der Benutzer nicht häufig ändert. Insbesondere wenn es sich um Daten handelt, die Sie später möglicherweise an eine andere Stelle senden möchten, werden sie in einem analysierbaren Format benötigt.
ToolmakerSteve

1
Ist es ratsam, einen JSON als JSON-Zeichenfolge in einer gemeinsamen Voreinstellung zu speichern?
Kaveesh Kanwal

2
@JCarlos Solange Sie keine prozessübergreifenden Aufgaben ausführen, können Sie SharedPreferences verwenden.
Mygod

96

Diese Frage hat eine akzeptierte Antwort, aber ich denke, es gibt mehr zu diesem Thema zu sagen - in Bezug auf Geschwindigkeit.

SharedPreferences und Sqlite DB einer Anwendung sind nur Dateien, die in den Verzeichnissen der Anwendung im Dateisystem des Geräts gespeichert sind. Wenn die Datenmenge nicht zu groß ist, umfasst die Sqlite-Option eine größere und kompliziertere Datei mit mehr Verarbeitungsaufwand für einen einfachen Zugriff.

Wenn die Art der Daten Ihre Wahl nicht bestimmt (wie in der akzeptierten Antwort erläutert) und die Geschwindigkeit eine Rolle spielt, ist es wahrscheinlich besser, SharedPreferences zu verwenden.

Das Lesen einiger Daten befindet sich häufig auf dem kritischen Weg zur Anzeige der Hauptaktivität. Daher denke ich, dass Geschwindigkeit oft sehr wichtig ist.

Ein letzter Gedanke zu Geschwindigkeit und Effizienz: Wenn Sie für einige strukturierte Daten eine SQLite-Datenbank verwenden müssen, ist es wahrscheinlich effizienter, Benutzereinstellungen auch in der Datenbank zu speichern, damit Sie keine zweite Datei öffnen. Dies ist eine eher geringfügige Überlegung - wahrscheinlich nur dann eine Überlegung wert, wenn Sie sowohl auf die strukturierten Daten als auch auf die Einstellungen zugreifen müssen, bevor Sie die Hauptaktivität anzeigen können.


6
Was ist mit der Lesbarkeit von Code? Ich denke, wenn mehrere Datensätze in SharedPrefs anstelle einer DB-Tabelle gespeichert werden, wird der Code verschlungen. SQL-Syntax ist einfacher zu lesen als eine Schleife über SharedPrefs-Einträge ...
IgorGanapolsky

8
Igor, ich würde nicht zustimmen. SharedPreferences sind wirklich eindimensional. Es ist sehr einfach, eine Präferenz zu verwenden. Zum Beispiel baue ich eine Aktienprüfungs-App, ich speichere einfach die Aktiensymbole in den Einstellungen. Ich muss sie nicht einzeln greifen, da ich immer alle aufliste, und das ist alles, was ich tue, speichere oder greife. Es ist so einfach, viel einfacher als die Verwendung einer Datenbank.
AutoM8R

1
Ich kann mir keine Situation vorstellen, in der die Lesbarkeit von Code schwierig wird, während die Struktur der zu speichernden Daten keine Verwendung einer hierarchischen Datenbank erfordert. Selbst wenn Lesbarkeitsprobleme auftreten, können diese mithilfe einer Wrapper-Klasse mit den erforderlichen Funktionen behoben werden.
Sarath Sadasivan Pillai

1
Können wir mehrere Schlüsselwerte in Form von Jsonstring-Daten unter gemeinsamen Einstellungen speichern? Gibt es eine Zeichenbeschränkung, die meine JSON-Werte abschneiden kann?
Nova

2
SharedPreferences werden nur einmal (pro App-Prozesslebenszyklus) in den Speicher geladen und dort gespeichert. danach ist es immer super schnell. Es gibt also keinen praktischen Leistungsgewinn, wenn SharedPref-Daten in SQLite eingefügt werden (nur um zusätzlichen Zugriff auf SharedPref-Dateien zu vermeiden). Übrigens sollten Sie Ihre SQLite-Inhalte nicht in die SharedPrefs einfügen. Wie gesagt, es ist immer im Speicher, was zu Problemen führen kann (nicht genügend Speicher).
Zsolt Safrany

20

Meiner Meinung nach geht es nicht um Geschwindigkeit oder Größe, sondern um die Art der Operation, die Sie mit Ihren Daten ausführen möchten.

Wenn Sie planen zu verbinden , sortieren , und andere DB - Operationen auf die Daten dann gehen SQLite . Ein Beispiel ist das Sortieren von Daten nach Datum.

Wenn Sie einfache Werte (wie int, boolean, String) zuordnen möchten, verwenden Sie die Einstellungen . DB-Operationen funktionieren hier nicht und es ist unnötig zu erwähnen, dass Sie alle Schlüssel haben müssen. Ein Beispiel ist das Benutzerkennwort oder die App-Konfiguration.

Die große Versuchung, Einstellungen zu akzeptieren, besteht darin, ein abgeflachtes POJO (ein serialisiertes JSON-Objekt) als Zeichenfolge zu speichern. Ein solches Bedürfnis zu haben, ist eigentlich das Zeichen, Sqlite zu verwenden. Warum ? Weil komplexe Daten irgendwann komplexe Operationen erfordern. Stellen Sie sich vor, Sie rufen einen bestimmten Eintrag ab, der mit einem einfachen "SELECT ... WHERE id = 1" verarbeitet werden kann. Im Pfad "Einstellungen" ist dies ein langer Prozess von der Deserialisierung bis zur Iteration der Ergebnisse.


Außerdem unterstützt SharedPreferences keine Transaktionen. Wenn Sie also Transaktionen benötigen, verwenden Sie SQLite. Wenn der Benutzer beispielsweise die Schaltfläche "Abmelden" drückt, möchten Sie möglicherweise mehrere SharedPreferencesSchlüssel / Werte gleichzeitig löschen (z. B. sowohl die userals auch die passwordTasten), damit Sie sicher sind, dass entweder beide Tasten deaktiviert oder beide festgelegt sind.
Runeks vor

5
  • Verwenden Sie zum Speichern großer Datenmengen das SQLite-Datenbanksystem. Dadurch kann der Benutzer auch nach Daten suchen.

  • Wählen Sie zum Speichern kleiner Datenmengen die Option "Gemeinsame Einstellungen". In diesem Fall ist ein riesiges Datenbanksystem nicht erforderlich. Auf diese Weise kann der Benutzer Daten einfach speichern und laden.


1
300 Schlüssel-Wert-Paare sind eine riesige Datenmenge? Ich muss es genau speichern.
JCarlosR

1
In diesem Fall sollten Sie sich für die SQLite-Datenbank entscheiden. Andernfalls ist es schwierig, diese 300 Daten zu verwalten und abzurufen.
Sami Al-Jabar

Wenn jedoch alle Schlüssel bekannt sind, ist es nicht einfacher, die Daten aus den freigegebenen Einstellungen abzurufen?
Arjun

-6

Vergessen Sie SQLLite, vergessen Sie SharedPreferences, verwenden Sie Realm. Eine einzige Lösung für Ihren gesamten lokalen Speicher. Sie können einfache alte Java-Objekte als RealmObjects verwenden und Ihre Daten dort speichern. Sie können ausgewählte Abfragen in JSON-Dateien konvertieren. Sie müssen nicht die gesamte Datenbank analysieren. Überprüfen Sie diesen Link: https://realm.io/news/introducing-realm/


12
Vergessen Sie alles, was Sie über Schonbezüge wissen.
Andrew G
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.