it-swarm.com.de

Welche Möglichkeiten zum Speichern von Daten habe ich, wenn ich React Native verwende? (iOS und Android)

Ich bin immer noch neu in der React Native-Welt und im Allgemeinen auch in der mobilen/Native-Welt und finde die Dokumentation etwas mangelhaft, wenn es um Datenpersistenz geht.

Welche Optionen habe ich zum Speichern von Daten in React Native und zu den Auswirkungen der einzelnen Typen? 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 das alles mit einer externen Datenbank funktionieren würde.

Ich möchte speziell wissen:

  • Was sind die verschiedenen Optionen für die Datenpersistenz?
  • Wo liegen die Grenzen dieser Persistenz (d. H. Wann sind die Daten nicht mehr verfügbar)? Zum Beispiel: beim Schließen der Anwendung, Neustarten des Telefons usw.
  • Gibt es Unterschiede (abgesehen von 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 gehandhabt?)
  • Gibt es noch andere Überlegungen, die ich berücksichtigen sollte?

Danke für Ihre Hilfe!

172
Sia

Folgendes habe ich gelernt, als ich herausgefunden habe, wie ich mit einigen meiner aktuellen App-Projekte am besten vorankomme.

Async Storage ("eingebaut" in React Native)

Ich verwende AsyncStorage für eine produktionsinterne App. Der Speicher bleibt lokal auf dem Gerät, ist unverschlüsselt (wie in einer anderen Antwort erwähnt) und geht verloren, wenn Sie die App löschen. Er sollte jedoch als Teil der Sicherungen Ihres Geräts gespeichert werden und bleibt während Upgrades erhalten (sowohl native Upgrades wie TestFlight als auch Code-Upgrades über CodePush) ).

Fazit: 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. Auf diese Weise erhalten Sie eine SQL-ähnliche Erfahrung mit komprimierbaren Datenbanken, die auch zum und vom Gerät übertragen werden können. Ich habe keine Erfahrung damit, sie mit einem Back-End zu synchronisieren, aber ich stelle mir vor, dass verschiedene Bibliotheken existieren. Es gibt RN-Bibliotheken für die Verbindung mit SQLite.

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.

Fazit: Lokale Speicherung; Sie liefern die Synchronisierung und Sicherung.

Firebase

Firebase bietet unter anderem eine noSQL-Datenbank in Echtzeit sowie einen JSON-Dokumentenspeicher (wie MongoDB), mit dem 1 bis n Clients synchronisiert werden können. In den Dokumenten wird von 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 Aktualisierung 2/18 unten). Die Bibliothek wird mit der Annahme geschrieben, dass ein Webbrowser eine Verbindung herstellen wird, und es wird daher eine semi-persistente Verbindung bestehen. Sie könnten wahrscheinlich einen lokalen Caching-Mechanismus schreiben, der die Firebase-Speicheraufrufe ergänzt, oder Sie könnten eine Brücke zwischen den nativen Bibliotheken und React Native schreiben.

[Update 2/2018] Ich habe seitdem festgestellt, dass React Native Firebase eine kompatible JavaScript-Oberfläche für die nativen iOS- und Android -Bibliotheken bietet (was Google wahrscheinlich hätte tun können/sollen). Sie erhalten alle Vorteile der einheimischen Bibliotheken mit dem Bonus von React Native Support. Mit Googles Einführung eines JSON-Dokumentenspeichers 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 erhält RN dieselben Vorteile wie Swift und Java. [/ update] Skaliert gut für mit dem Netzwerk verbundene Geräte. Niedrige Kosten bei geringer Auslastung. Kombinierbar mit anderen Cloud-Angeboten von Google. Daten sind über die Benutzeroberfläche gut sichtbar und bearbeitbar.

Realm

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 sporadischer oder verlustbehafteter Netzwerkkonnektivität umgehen.

Sie bieten eine kostenlose Version des Objektspeichers an, 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 auf dem Gerät vorhanden sind, Nur-Geräte-Speicher, die nicht mit dem Server synchronisiert werden, Nur-Lese-Serverspeicher und die vollständige Lese-/Schreiboption für die Synchronisierung auf einem oder mehreren Geräten. Sie haben professionelle und unternehmerische Optionen, die im Vorfeld mehr kosten als Firebase.

Im Gegensatz zu Firebase werden in React Native und Xamarin alle Realm-Funktionen unterstützt, genau 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-Sicherheit. Der direkte Zugriff ist über die von Realm bereitgestellten GUI-Tools möglich. Datendateien auf dem Gerät sind plattformübergreifend kompatibel.

Fazit: Gerät zuerst, optionale Synchronisation mit kostenlosen und kostenpflichtigen Tarifen. 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 Realm werden hier Daten lokal gespeichert und wenn möglich mit iCloud synchronisiert. Es gibt öffentliche Stores für Ihre App und private Stores 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: Großartig für Apple-bezogene 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 Site, in dem sie Dinge mit React Native verknüpfen können. 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, auf Ihre Daten außerhalb Ihrer App oder der von Ihnen erstellten APIs zuzugreifen.

[Bearbeiten: Es wurde ein älterer Link gefunden, der sich mit Couchbase und CouchDB befasst, und CouchDB ist möglicherweise eine weitere in Betracht zu ziehende Option. Die beiden sind historisch verwandt, aber derzeit völlig unterschiedliche Produkte. Siehe dieser Vergleich .]

Fazit: Sieht nach ähnlichen Fähigkeiten aus wie Realm. Kann nur für Geräte oder synchronisiert werden. Ich muss es ausprobieren.

MongoDB

Ich verwende diese Serverseite für einen Teil der App, der AsyncStorage lokal verwendet. Mir gefällt, dass alles als JSON-Objekte gespeichert ist, 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 sind nicht wie ein Schema fest strukturiert, sodass jedes Objekt als "Dokument" gespeichert wird, das leicht zu durchsuchen, zu filtern usw. ist. Ähnliche JSON-Objekte können zusätzliche (aber unterschiedliche) Attribute oder untergeordnete Objekte haben, die Folgendes ermöglichen: a Viel Flexibilität bei der Strukturierung Ihrer Objekte/Daten.

Ich habe keine Client-Server-Synchronisationsfunktionen ausprobiert und auch keine eingebetteten Funktionen verwendet. React Nativer Code für MongoDB ist vorhanden.

Fazit: Nur lokale NoSQL-Lösung, keine offensichtliche Synchronisationsoption 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 geschieht durch Code auf Ihrem Server), haben sie ein serverloses Front-End erstellt, mit dem Ihre Apps kommunizieren können, falls Sie ihre verwenden möchten gehostete Lösung (Atlas). Ihre Dokumentation lässt erkennen, 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 finden Sie im Dokument ( https://www.mongodb.com/blog/post/building-ios-and-Android-apps-with-the-mongodb-stitch-react-native-sdk ).

Twilio Sync

Eine weitere NoSQL-Option für die Synchronisation ist Twilios Sync. Von ihrer Site aus: "Mit Sync können Sie den Status auf einer beliebigen Anzahl von Geräten in Echtzeit skalieren, ohne Back-End-Infrastrukturen 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 habe. Ich mag auch ihre anderen Kommunikationstools und habe sie zum Versenden von SMS-Updates über eine einfache Web-App verwendet.

[/Aktualisieren]


[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 bei diesen beiden auch sehr hilfreich zu sein, da sie die Menge des zu schreibenden Backend-Codes begrenzen.

Ich liebe die Flexibilität des MongoDB-Datenspeichers, sodass ich mich für die Serverseite von webbasierten und anderen verbindungserfordernden Apps entschieden habe.

Ich habe RESTHeart gefunden, wodurch eine sehr einfache, skalierbare RESTful-API für MongoDB erstellt wird. Es sollte nicht zu schwierig sein, eine React (Native) -Komponente zu erstellen, die JSON-Objekte in RESTHeart liest und schreibt und diese dann an/von MongoDB übergibt.


[Bearbeiten] Ich habe Informationen hinzugefügt, wie die Daten gespeichert werden. Manchmal ist es wichtig zu wissen, wie viel Arbeit während der Entwicklung und des Testens anfällt, wenn Sie die Daten optimieren und testen müssen.


[Update 2/2019] Ich habe mit mehreren dieser Optionen experimentiert, als ich im vergangenen Jahr (2018) ein Projekt mit hoher Parallelität entworfen habe. Einige von ihnen erwähnen in ihrer Dokumentation Grenzwerte für die harte und weiche Parallelität (Firebase hatte meines Erachtens bei 10.000 Verbindungen ein hartes Limit, während Twilios laut Diskussionen mit beiden Teams bei AltConf ein weiches Limit war, das überschritten werden konnte).

Wenn Sie eine App für Zehntausende von Benutzern entwerfen, können Sie das Daten-Backend entsprechend skalieren.

219
Bryan Scott

Schnell und schmutzig: Verwenden Sie einfach Redux + Reactive-Redux + Redux-Persist + AsyncStorage für Reactive-Native.

Es passt fast perfekt in die reaktive Heimatwelt und wirkt wie ein Zauber sowohl für Android als auch für ios. Außerdem gibt es eine solide Community und viele Informationen.

Ein funktionierendes Beispiel finden Sie in der F8App von Facebook.

Was sind die verschiedenen Optionen für die Datenpersistenz?

Wenn Sie native reagieren, möchten Sie wahrscheinlich Redux und Redux-Persist verwenden. Es können mehrere Speicher-Engines verwendet werden. AsyncStorage und Redux-Persist-Filesystem-Storage sind die Optionen für RN.

Es gibt andere Optionen wie Firebase oder Realm, aber ich habe diese in einem RN-Projekt nie verwendet.

Wo liegen die Grenzen dieser Persistenz (d. H. Wann sind die Daten nicht mehr verfügbar)? Zum Beispiel: beim Schließen der Anwendung, Neustarten des Telefons usw.

Mit redux + redux-persist können Sie definieren, was beibehalten wird und was nicht. Wenn dies nicht der Fall ist, sind Daten vorhanden, während die App ausgeführt wird. Bei Beibehaltung bleiben die Daten zwischen den App-Ausführungen erhalten (Schließen, Öffnen, Neustarten des Telefons usw.).

AsyncStorage hat ein Standardlimit von 6 MB für Android. 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.

Gibt es Unterschiede (abgesehen von der allgemeinen Einrichtung) zwischen der Implementierung in iOS und Android?

Mit redux + redux-persist + AsyncStorage ist das Setup auf Android und iOS genau gleich.

Wie vergleichen sich die Optionen für den Offline-Zugriff auf Daten? (oder wie wird der Offline-Zugriff normalerweise gehandhabt?)

Bei Verwendung von Redux erfolgt der Offline-Zugriff dank seiner Designteile (Aktionsersteller und Reduzierer) 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 anzugeben. 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, die Sie an den Server senden und die noch ausstehen, speichern und entsprechend behandeln.

Gibt es noch andere Überlegungen, die ich berücksichtigen sollte?

React fördert eine reaktive Art, Apps zu erstellen, und Redux passt sehr gut dazu. Probieren Sie es aus, 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.

47
Filipe Borges

Die obigen Leute treffen die richtigen Notizen für die Speicherung. Wenn Sie jedoch auch PII-Daten berücksichtigen müssen, die gespeichert werden müssen, können Sie den Schlüsselbund auch mit etwas wie https://github.com/oblador/react) verstecken -native-keychain da ASyncStorage unverschlüsselt ist. Es kann als Teil der Persist-Konfiguration in so etwas wie Redux-Persist angewendet werden.

8
Jeff Chew

sie können Speicher synchronisieren verwenden, das einfacher zu verwenden ist als asynchroner Speicher. Diese Bibliothek verwendet Async-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.

import SyncStorage from 'sync-storage';

SyncStorage.set('foo', 'bar');
const result = SyncStorage.get('foo');
console.log(result); // 'bar'
1
sajad abbasi

sie können Realm oder SQLite verwenden, wenn Sie komplexe Datentypen verwalten möchten.

Ansonsten gehts mit eingebautem reaktiven Asynstorage

1
sreerag

Wir brauchen kein Redux-Persist, wir können einfach Redux für die Persistenz verwenden.

react-Redux + AsyncStorage = Redux-Persist

also füge einfach diese Zeilen hinzu

store.subscribe(async()=> await AsyncStorage.setItem("store", JSON.stringify(store.getState())))

dadurch wird der AsyncStorage aktualisiert, wenn Änderungen im Redux-Speicher vorgenommen werden.

Laden Sie dann den von json konvertierten Speicher. Wann immer die App geladen wird. und legen Sie den Speicher erneut fest.

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 obigen Abonnentenfunktion

0