Ich bin noch neu in der React Native-Welt und im Allgemeinen auch in der mobilen / nativen Welt, und ich finde die Dokumentation etwas mangelhaft, wenn es um Datenpersistenz geht.
Welche Optionen habe ich zum Speichern von Daten in React Native und welche Auswirkungen hat jeder Typ? Ich sehe zum Beispiel, dass es lokalen Speicher und asynchronen Speicher gibt, aber dann sehe ich auch Dinge wie Realm, und ich bin verwirrt, wie all dies mit einer externen Datenbank funktionieren würde.
Ich möchte speziell wissen:
- Welche verschiedenen Optionen gibt es für die Datenpersistenz?
- Was sind für jeden die Grenzen dieser Persistenz (dh wann sind die Daten nicht mehr verfügbar)? Zum Beispiel: Wenn Sie die Anwendung schließen, das Telefon neu starten usw.
- Gibt es Unterschiede (außer der allgemeinen Einrichtung) zwischen der Implementierung in iOS und Android?
- Wie vergleichen sich die Optionen für den Offline-Zugriff auf Daten? (oder wie wird der Offline-Zugriff normalerweise behandelt?)
- Gibt es noch andere Überlegungen, die ich berücksichtigen sollte?
Danke für Ihre Hilfe!
android
ios
react-native
Sia
quelle
quelle
Antworten:
Folgendes habe ich gelernt, als ich herausgefunden habe, wie ich mit einigen meiner aktuellen App-Projekte am besten vorankommen kann.
Async-Speicher ("integriert", um Native zu reagieren )
Ich verwende AsyncStorage für eine In-Production-App. Der Speicher bleibt lokal auf dem Gerät, ist unverschlüsselt (wie in einer anderen Antwort erwähnt), verschwindet, wenn Sie die App löschen, sollte jedoch als Teil der Sicherungen Ihres Geräts gespeichert werden und bleibt während der Aktualisierungen erhalten (sowohl native Aktualisierungen als TestFlight als auch Code-Aktualisierungen über CodePush ).
Schlussfolgerung: Lokale Speicherung; Sie stellen Ihre eigene Synchronisierungs- / Sicherungslösung bereit.
SQLite
Andere Projekte, an denen ich gearbeitet habe, haben sqlite3 für die App-Speicherung verwendet. Dies gibt Ihnen eine SQL-ähnliche Erfahrung mit komprimierbaren Datenbanken, die auch zum und vom Gerät übertragen werden können. Ich habe keine Erfahrung mit der Synchronisierung mit einem Back-End, aber ich stelle mir vor, dass verschiedene Bibliotheken existieren. Es gibt RN-Bibliotheken für die Verbindung mit SQLite.
Die Daten werden in Ihrem herkömmlichen Datenbankformat gespeichert, wobei Datenbanken, Tabellen, Schlüssel, Indizes usw. in einem Binärformat auf der Festplatte gespeichert werden. Der direkte Zugriff auf die Daten ist über die Befehlszeile oder über Apps mit SQLite-Treibern möglich.
Schlussfolgerung: Lokale Speicherung; Sie liefern die Synchronisierung und Sicherung.
Feuerbasis
Firebase bietet unter anderem eine Echtzeit-NoSQL-Datenbank sowie einen JSON-Dokumentenspeicher (wie MongoDB), mit dem 1 bis n Clients synchronisiert werden können. In den Dokumenten wird über die Offline-Persistenz gesprochen, jedoch nur für nativen Code (Swift / Obj-C, Java). Googles eigene JavaScript-Option ("Web"), die von React Native verwendet wird, bietet keine zwischengespeicherte Speicheroption (siehe Update 2/18 unten). Die Bibliothek wird unter der Annahme geschrieben, dass ein Webbrowser eine Verbindung herstellen wird, sodass eine semi-persistente Verbindung besteht. Sie könnten wahrscheinlich einen lokalen Caching-Mechanismus schreiben, um die Firebase-Speicheraufrufe zu ergänzen, oder Sie könnten eine Brücke zwischen den nativen Bibliotheken und React Native schreiben.
Update 2/2018 Seitdem habe ich React Native Firebase gefunden , das eine kompatible JavaScript-Oberfläche für die nativen iOS- und Android-Bibliotheken bietet (was Google wahrscheinlich hätte tun können / sollen) und Ihnen alle Extras der nativen Bibliotheken mit dem Bonus von React bietet Native Unterstützung. Mit der Einführung eines JSON-Dokumentenspeichers durch Google neben der Echtzeitdatenbank gebe ich Firebase einen guten zweiten Einblick in einige Echtzeit-Apps, die ich erstellen möchte.
Die Echtzeitdatenbank wird als JSON-ähnlicher Baum gespeichert, den Sie auf der Website bearbeiten und ganz einfach importieren / exportieren können.
Fazit: Mit der React-Native-Firebase bietet RN dieselben Vorteile wie Swift und Java. [/ update] Skaliert gut für Geräte mit Netzwerkverbindung. Niedrige Kosten bei geringer Auslastung. Kombiniert sich gut mit anderen Google Cloud-Angeboten. Daten sind über ihre Benutzeroberfläche gut sichtbar und können bearbeitet werden.
Reich
Update 4/2020 MongoDB hat Realm erworben und plant, es mit MongoDB Stitch ( siehe unten) zu kombinieren. Das sieht sehr aufregend aus .
Auch ein Echtzeit-Objektspeicher mit automatischer Netzwerksynchronisation. Sie preisen sich als "Gerät zuerst" an und das Demo-Video zeigt, wie die Geräte mit sporadischen oder verlustbehafteten Netzwerkverbindungen umgehen.
Sie bieten eine kostenlose Version des Objektspeichers, den Sie auf Ihren eigenen Servern oder in einer Cloud-Lösung wie AWS oder Azure hosten. Sie können auch In-Memory-Speicher erstellen, die nicht mit dem Gerät bestehen, Nur-Gerätespeicher, die nicht mit dem Server synchronisiert werden, Nur-Lese-Server-Speicher und die vollständige Lese- / Schreiboption für die Synchronisierung zwischen einem oder mehreren Geräten. Sie verfügen über professionelle und Unternehmensoptionen, die im Voraus mehr pro Monat kosten als Firebase.
Im Gegensatz zu Firebase werden alle Realm-Funktionen in React Native und Xamarin ebenso unterstützt wie in Swift / ObjC / Java (native) Apps.
Ihre Daten sind an Objekte in Ihrem Code gebunden. Da es sich um definierte Objekte handelt, verfügen Sie über ein Schema, und die Versionskontrolle ist ein Muss für die Code-Integrität. Der direkte Zugriff ist über die von Realm bereitgestellten GUI-Tools möglich. Gerätedatendateien sind plattformübergreifend kompatibel.
Fazit: Gerät zuerst, optionale Synchronisation mit kostenlosen und kostenpflichtigen Plänen. Alle in React Native unterstützten Funktionen. Horizontale Skalierung teurer als Firebase.
iCloud
Ich habe ehrlich gesagt nicht viel damit gespielt, werde es aber in naher Zukunft tun.
Wenn Sie eine native App haben, die CloudKit verwendet, können Sie CloudKit JS verwenden, um über eine Web-App (oder in unserem Fall React Native) eine Verbindung zu den Containern Ihrer App herzustellen. In diesem Szenario hätten Sie wahrscheinlich eine native iOS-App und eine React Native Android-App.
Wie bei Realm werden hier Daten lokal gespeichert und nach Möglichkeit mit iCloud synchronisiert. Es gibt öffentliche Geschäfte für Ihre App und private Geschäfte für jeden Kunden. Kunden können sogar einige ihrer Geschäfte oder Objekte für andere Benutzer freigeben.
Ich weiß nicht, wie einfach es ist, auf die Rohdaten zuzugreifen. Die Schemas können auf der Apple-Website eingerichtet werden.
Fazit: Ideal für Apple-Apps.
Couchbase
Großer Name, viele große Unternehmen dahinter. Es gibt eine Community Edition und eine Enterprise Edition mit den Standard-Supportkosten.
Sie haben ein Tutorial auf ihrer Website, um Dinge mit React Native zu verbinden. Ich habe auch nicht viel Zeit damit verbracht, aber es scheint eine praktikable Alternative zu Realm in Bezug auf die Funktionalität zu sein. Ich weiß nicht, wie einfach es ist, außerhalb Ihrer App oder der von Ihnen erstellten APIs auf Ihre Daten zuzugreifen.
[Bearbeiten: Es wurde ein älterer Link gefunden, der sich mit Couchbase und CouchDB befasst, und CouchDB ist möglicherweise eine weitere Option. Die beiden sind historisch verwandt, aber derzeit völlig unterschiedliche Produkte. Siehe diesen Vergleich .]
Fazit: Scheint ähnliche Fähigkeiten wie Realm zu haben. Kann nur für Geräte oder synchronisiert werden. Ich muss es ausprobieren.
MongoDB
Update 4/2020
Mongo hat Realm übernommen und plant, MongoDB Stitch (siehe unten) mit Realm (siehe oben) zu kombinieren .
Ich verwende diese Serverseite für einen Teil der App, der AsyncStorage lokal verwendet. Ich mag es, dass alles als JSON-Objekte gespeichert wird, was die Übertragung auf die Client-Geräte sehr einfach macht. In meinem Anwendungsfall wird es als Cache zwischen einem Upstream-Anbieter von TV-Programmdaten und meinen Clientgeräten verwendet.
Die Daten haben keine feste Struktur wie ein Schema, daher wird jedes Objekt als "Dokument" gespeichert, das leicht zu durchsuchen, zu filtern usw. ist. Ähnliche JSON-Objekte können zusätzliche (aber unterschiedliche) Attribute oder untergeordnete Objekte aufweisen, sodass a Viel Flexibilität bei der Strukturierung Ihrer Objekte / Daten.
Ich habe keine Client-zu-Server-Synchronisierungsfunktionen ausprobiert und sie auch nicht eingebettet verwendet. Reagieren Native Code für MongoDB existiert.
Fazit: Nur lokale NoSQL-Lösung, keine offensichtliche Synchronisierungsoption wie Realm oder Firebase.
Update 2/2019
MongoDB hat ein "Produkt" (oder eine Dienstleistung) namens Stitch. Da Clients (im Sinne von Webbrowsern und Telefonen) nicht direkt mit MongoDB kommunizieren sollten (dies erfolgt über Code auf Ihrem Server), haben sie ein serverloses Front-End erstellt, mit dem Ihre Apps eine Schnittstelle herstellen können, falls Sie sich für deren Verwendung entscheiden gehostete Lösung (Atlas). Ihre Dokumentation lässt den Eindruck entstehen, dass es eine mögliche Synchronisierungsoption gibt.
In diesem Artikel vom Dezember 2018 wird die Verwendung von React Native, Stitch und MongoDB in einer Beispiel-App erläutert. Weitere Beispiele sind im Dokument verlinkt ( https://www.mongodb.com/blog/post/building-ios-and-android-apps) -mit-dem-Mongodb-Stich-reagieren-native-SDK ).
Twilio Sync
Eine weitere NoSQL-Option für die Synchronisierung ist Twilios Sync. Von ihrer Website aus: "Mit Sync können Sie den Status auf einer beliebigen Anzahl von Geräten in Echtzeit in großem Maßstab verwalten, ohne eine Backend-Infrastruktur verwalten zu müssen."
Ich habe dies als Alternative zu Firebase für eines der oben genannten Projekte angesehen, insbesondere nachdem ich mit beiden Teams gesprochen hatte. Ich mag auch ihre anderen Kommunikationstools und habe sie zum Senden von SMS-Updates aus einer einfachen Web-App verwendet.
[Bearbeiten] Ich habe einige Zeit mit Realm verbracht, seit ich das ursprünglich geschrieben habe. Mir gefällt, dass ich keine API schreiben muss, um die Daten zwischen der App und dem Server zu synchronisieren, ähnlich wie bei Firebase. Serverlose Funktionen scheinen auch bei diesen beiden sehr hilfreich zu sein, da sie die Menge an Backend-Code begrenzen, die ich schreiben muss.
Ich mag die Flexibilität des MongoDB-Datenspeichers, sodass ich mich für die Serverseite von webbasierten und anderen verbindungspflichtigen Apps entscheide.
Ich habe RESTHeart gefunden , das eine sehr einfache, skalierbare RESTful-API für MongoDB erstellt. Es sollte nicht zu schwierig sein, eine React (Native) -Komponente zu erstellen, die JSON-Objekte liest und in RESTHeart schreibt, die sie wiederum an / von MongoDB weitergeben.
[Bearbeiten] Ich habe Informationen darüber hinzugefügt, wie die Daten gespeichert werden. Manchmal ist es wichtig zu wissen, wie viel Arbeit Sie während der Entwicklung und des Testens benötigen, wenn Sie die Daten optimieren und testen müssen.
Änderungen 2/2019 Ich habe im vergangenen Jahr (2018) mit mehreren dieser Optionen experimentiert, als ich ein Projekt mit hoher Parallelität entworfen habe. Einige von ihnen erwähnen in ihrer Dokumentation Hard- und Soft-Parallelitätslimits (Firebase hatte ein hartes Limit bei 10.000 Verbindungen, glaube ich, während Twilio ein weiches Limit war, das laut Diskussionen mit beiden Teams bei AltConf erhöht werden konnte).
Wenn Sie eine App für Zehntausende von Benutzern entwerfen, müssen Sie das Daten-Backend entsprechend skalieren.
quelle
AsyncStorage
unterstützt einer nur 6 MB in Android, während es für iOS keine solche Einschränkung gibt.Quick and dirty: Verwenden Sie nur Redux + reagieren-redux + redux-persistieren + AsyncStorage für reagieren-native.
Es passt fast perfekt in die einheimische Welt und wirkt wie ein Zauber für Android und iOS. Es gibt auch eine solide Community und viele Informationen.
Ein funktionierendes Beispiel finden Sie in der F8App von Facebook.
Mit React Native möchten Sie wahrscheinlich Redux und Redux-Persist verwenden. Es können mehrere Speicher-Engines verwendet werden. AsyncStorage und Redux-Persist-Dateisystemspeicher sind die Optionen für RN.
Es gibt andere Optionen wie Firebase oder Realm, aber ich habe diese nie in einem RN-Projekt verwendet.
Mit redux + redux-persist können Sie definieren, was beibehalten wird und was nicht. Wenn nicht beibehalten, sind Daten vorhanden, während die App ausgeführt wird. Wenn die Daten beibehalten werden, bleiben sie zwischen den App-Ausführungen (Schließen, Öffnen, Neustarten des Telefons usw.) bestehen.
AsyncStorage hat unter Android ein Standardlimit von 6 MB. Es ist möglich, ein größeres Limit (für Java-Code) zu konfigurieren oder redux-persist-filesystem-storage als Speicher-Engine für Android zu verwenden.
Mit redux + redux-persist + AsyncStorage ist das Setup unter Android und iOS genau das gleiche.
Bei Verwendung von Redux erfolgt der Offiline-Zugriff dank seiner Designteile (Action Creators und Reducer) fast automatisch.
Alle Daten, die Sie abgerufen und gespeichert haben, sind verfügbar. Sie können problemlos zusätzliche Daten speichern, um den Status (Abrufen, Erfolg, Fehler) und den Zeitpunkt des Abrufs anzuzeigen. Normalerweise macht das Anfordern eines Abrufs ältere Daten nicht ungültig und Ihre Komponenten werden nur aktualisiert, wenn neue Daten empfangen werden.
Gleiches gilt in die andere Richtung. Sie können Daten speichern, die Sie an den Server senden und die noch ausstehen, und sie entsprechend behandeln.
React fördert eine reaktive Art der Erstellung von Apps und Redux passt sehr gut darauf. Sie sollten es versuchen, bevor Sie eine Option verwenden, die Sie in Ihrer regulären Android- oder iOS-App verwenden würden. Außerdem finden Sie viel mehr Dokumente und Hilfe für diese.
quelle
Die oben genannten Personen treffen die richtigen Hinweise zum Speichern. Wenn Sie jedoch auch alle PII-Daten berücksichtigen müssen, die gespeichert werden müssen, können Sie sie auch mithilfe von https://github.com/oblador/react-native-keychain im Schlüsselbund speichern da ASyncStorage unverschlüsselt ist. Es kann als Teil der Persist-Konfiguration in so etwas wie Redux-Persist angewendet werden.
quelle
Sie können einen Synchronisierungsspeicher verwenden , der einfacher zu verwenden ist als ein asynchroner Speicher. Diese Bibliothek ist großartig. Sie verwendet asynchronen Speicher, um Daten asynchron zu speichern, und verwendet Speicher, um Daten sofort synchron zu laden und zu speichern. Daher speichern wir Daten asynchron im Speicher und verwenden sie für die App-Synchronisierung. Das ist also großartig.
quelle
Sie können Realm oder Sqlite verwenden, wenn Sie komplexe Datentypen verwalten möchten.
Ansonsten gehen Sie mit eingebautem nativem Asynstorage
quelle
Wir brauchen keine Redux-Persistenz, wir können Redux einfach für die Persistenz verwenden.
React-Redux + AsyncStorage = Redux-Persist
Fügen Sie in der Datei "createotre" einfach diese Zeilen hinzu
Dadurch wird der AsyncStorage aktualisiert, wenn Änderungen im Redux-Speicher vorgenommen werden.
Laden Sie dann den konvertierten JSON-Speicher. wann immer die App geladen wird. und stellen Sie den Speicher erneut ein.
Weil Redux-Persist Probleme bei der Verwendung von Wix React-Native-Navigation verursacht. Wenn dies der Fall ist, bevorzuge ich die Verwendung von einfachem Redux mit der oben genannten Teilnehmerfunktion
quelle