Jakie są moje opcje przechowywania danych podczas korzystania z React Native? (iOS i Android) [zamknięte]

230

Nadal jestem nowy w świecie React Native, a także ogólnie w świecie mobilnym / macierzystym, i brakuje mi dokumentacji, jeśli chodzi o trwałość danych.

Jakie są moje opcje przechowywania danych w React Native i implikacje każdego typu? Na przykład widzę, że istnieje pamięć lokalna i pamięć asynchroniczna, ale potem widzę też takie rzeczy jak Realm i jestem zdezorientowany, jak to wszystko mogłoby działać z zewnętrzną bazą danych.

W szczególności chcę wiedzieć:

  • Jakie są różne opcje utrwalania danych?
  • Jakie są granice tej trwałości dla każdego (tj. Kiedy dane nie są już dostępne)? Na przykład: po zamknięciu aplikacji, ponownym uruchomieniu telefonu itp.
  • Czy dla każdego z nich istnieją różnice (inne niż ogólna konfiguracja) między implementacją w systemie iOS a systemem Android?
  • Jak wyglądają opcje dostępu do danych offline? (lub jak zazwyczaj obsługiwany jest dostęp offline?)
  • Czy są jeszcze jakieś względy, o których powinienem pamiętać?

Dzięki za pomoc!

Sia
źródło
jeśli chcesz przechowywać dane wrażliwe, możesz spojrzeć na to: stackoverflow.com/questions/45547657/...
Julien Kode
po prostu użyj Realm oczywiście
Fattie
po prostu skorzystaj z back4app, jeśli chcesz prostego rozwiązania (np. parse.com)
Fattie
15
Jak to często bywa w przypadku SO, pytania, które są przydatne dla dużej liczby osób, są przez kogoś zamykane ... może to powinno powiedzieć społeczności SO coś o „regułach” i sposobie ich stosowania? Spróbuj spojrzeć na najczęściej używane posty i przekonaj się, ile osób przestrzega „zasad”. Ktoś słucha?
user2330237

Odpowiedzi:

286

Oto, czego się nauczyłem, gdy określam najlepszy sposób na przejście do kilku moich bieżących projektów aplikacji.

Pamięć asynchroniczna („wbudowana” w React Native)

Używam AsyncStorage do aplikacji w produkcji. Pamięć pozostaje lokalna dla urządzenia, jest nieszyfrowana (jak wspomniano w innej odpowiedzi), znika, jeśli usuwasz aplikację, ale powinna być zapisywana jako część kopii zapasowych urządzenia i utrzymuje się podczas aktualizacji (zarówno aktualizacje natywne ala TestFlight, jak i aktualizacje kodu za pomocą CodePush ).

Wniosek: przechowywanie lokalne; zapewniasz własne rozwiązanie synchronizacji / tworzenia kopii zapasowych.

SQLite

Inne projekty, nad którymi pracowałem, wykorzystywały sqlite3 do przechowywania aplikacji. Daje to wrażenia podobne do SQL, dzięki kompresyjnym bazom danych, które mogą być również przesyłane do i z urządzenia. Nie miałem doświadczenia w synchronizowaniu ich z zapleczem, ale wyobrażam sobie, że istnieją różne biblioteki. Istnieją biblioteki RN do łączenia się z SQLite.

Dane są przechowywane w tradycyjnym formacie bazy danych z bazami danych, tabelami, kluczami, indeksami itp. Zapisanymi na dysku w formacie binarnym. Bezpośredni dostęp do danych jest możliwy za pośrednictwem wiersza polecenia lub aplikacji ze sterownikami SQLite.

Wniosek: przechowywanie lokalne; zapewniasz synchronizację i kopię zapasową.

Firebase

Firebase oferuje między innymi bazę danych noSQL w czasie rzeczywistym oraz magazyn dokumentów JSON (taki jak MongoDB) przeznaczony do synchronizacji od 1 do n liczby klientów. Dokumenty mówią o trwałości offline, ale tylko w przypadku kodu natywnego (Swift / Obj-C, Java). Własna opcja Google JavaScript („Internet”), która jest używana przez React Native, nie zapewnia opcji pamięci podręcznej (patrz aktualizacja 2/18 poniżej). Biblioteka jest napisana przy założeniu, że przeglądarka internetowa będzie się łączyła, a więc będzie połączenie półtrwałe. Prawdopodobnie możesz napisać lokalny mechanizm buforowania w celu uzupełnienia wywołań pamięci Firebase, lub możesz napisać pomost między bibliotekami natywnymi a React Native.

Aktualizacja 2/2018 Od tamtej pory znalazłem React Native Firebase, który zapewnia kompatybilny interfejs JavaScript dla rodzimych bibliotek iOS i Android (robiąc to, co Google prawdopodobnie powinien / powinien zrobić), dając ci wszystkie zalety rodzimych bibliotek z premią React Natywne wsparcie. Wraz z wprowadzeniem przez Google magazynu dokumentów JSON obok bazy danych w czasie rzeczywistym, daję Firebase dobry wgląd w niektóre aplikacje w czasie rzeczywistym, które planuję zbudować.

Baza danych w czasie rzeczywistym jest przechowywana jako drzewo podobne do JSON, które można edytować na stronie internetowej i importować / eksportować po prostu.

Wniosek: RN z rodzajem React-Native-Firebase ma takie same korzyści jak Swift i Java. [/ update] Dobrze skaluje się dla urządzeń podłączonych do sieci. Niski koszt niskiego wykorzystania. Ładnie łączy się z innymi ofertami chmurowymi Google. Dane łatwo widoczne i edytowalne z poziomu interfejsu.

Królestwo

Aktualizacja 4/2020 MongoDB nabył Realm i planuje połączyć go ze ściegiem MongoDB (omówionym poniżej). To wygląda bardzo ekscytująco .


Również magazyn obiektów w czasie rzeczywistym z automatyczną synchronizacją sieci. Występują jako „najpierw urządzenia”, a film demonstracyjny pokazuje, jak urządzenia radzą sobie ze sporadyczną lub utratą łączności z siecią.

Oferują bezpłatną wersję magazynu obiektów, który hostujesz na własnych serwerach lub w rozwiązaniu chmurowym, takim jak AWS lub Azure. Można także tworzyć magazyny w pamięci, które nie utrzymują się na urządzeniu, sklepy tylko dla urządzeń, które nie synchronizują się z serwerem, magazyny serwerów tylko do odczytu oraz pełną opcję odczytu i zapisu do synchronizacji na jednym lub większej liczbie urządzeń. Mają opcje profesjonalne i dla przedsiębiorstw, które kosztują z góry więcej miesięcznie niż Firebase.

W przeciwieństwie do Firebase wszystkie możliwości Realm są obsługiwane w React Native i Xamarin, podobnie jak w aplikacjach Swift / ObjC / Java (natywnych).

Twoje dane są powiązane z obiektami w kodzie. Ponieważ są to obiekty zdefiniowane, masz schemat, a kontrola wersji jest niezbędna dla zachowania poprawności kodu. Bezpośredni dostęp jest dostępny za pośrednictwem narzędzi GUI, które zapewnia Realm. Pliki danych na urządzeniu są kompatybilne z wieloma platformami.

Wniosek: najpierw urządzenie, opcjonalna synchronizacja z planami bezpłatnymi i płatnymi. Wszystkie funkcje obsługiwane w React Native. Skalowanie w poziomie jest droższe niż Firebase.

iCloud

Szczerze mówiąc, nie grałem dużo z tym, ale zrobię to w najbliższej przyszłości.

Jeśli masz natywną aplikację korzystającą z CloudKit, możesz użyć CloudKit JS do łączenia się z kontenerami aplikacji z aplikacji internetowej (lub, w naszym przypadku, React Native). W tym scenariuszu prawdopodobnie miałbyś natywną aplikację na iOS i aplikację React Native na Androida.

Podobnie jak Realm, przechowuje dane lokalnie i synchronizuje je z iCloud, jeśli to możliwe. Istnieją publiczne sklepy z aplikacjami i prywatne sklepy dla każdego klienta. Klienci mogą nawet udostępniać niektóre swoje sklepy lub obiekty innym użytkownikom.

Nie wiem, jak łatwo jest uzyskać dostęp do surowych danych; schematy można skonfigurować na stronie Apple.

Wniosek: doskonały do ​​aplikacji ukierunkowanych na Apple.

Kanapa

Wielkie nazwisko, za tym stoi wiele dużych firm. Istnieje edycja Community Edition i Enterprise Edition ze standardowymi kosztami wsparcia.

Na swojej stronie znajduje się samouczek dotyczący podłączania React Native. Nie spędziłem też dużo czasu na tym, ale wygląda na to, że jest realną alternatywą dla Realm pod względem funkcjonalności. Nie wiem, jak łatwo można uzyskać dostęp do danych poza aplikacją lub tworzonymi interfejsami API.

[Edytuj: Znaleziono starszy link, który mówi o Couchbase i CouchDB, a CouchDB może być jeszcze jedną opcją do rozważenia. Oba są historycznie powiązane, ale obecnie zupełnie różne produkty. Zobacz to porównanie .]

Wniosek: Wygląda na to, że ma podobne możliwości jak Królestwo. Może być tylko na urządzeniu lub zsynchronizowany. Muszę to wypróbować.

MongoDB

Aktualizacja 4/2020

Mongo nabyło Realm i planuje połączyć ścieg MongoDB (omówiony poniżej) z Realm (omówiony powyżej).


Korzystam z tej strony serwera dla części aplikacji, która używa AsyncStorage lokalnie. Podoba mi się, że wszystko jest przechowywane jako obiekty JSON, dzięki czemu transmisja do urządzeń klienckich jest bardzo prosta. W moim przypadku jest on używany jako pamięć podręczna między dostawcą danych przewodnika telewizyjnego a urządzeniami klienckimi.

Dane nie mają twardej struktury, takiej jak schemat, więc każdy obiekt jest przechowywany jako „dokument”, który można łatwo przeszukiwać, filtrować itp. Podobne obiekty JSON mogą mieć dodatkowe (ale różne) atrybuty lub obiekty potomne, co pozwala na duża elastyczność w strukturze obiektów / danych.

Nie próbowałem żadnych funkcji synchronizacji między klientem a serwerem ani nie korzystałem z niego wbudowanego. React Istnieje natywny kod MongoDB.

Wniosek: tylko lokalne rozwiązanie NoSQL, brak oczywistej opcji synchronizacji, takiej jak Realm lub Firebase.

Aktualizacja 2/2019

MongoDB ma „produkt” (lub usługę) o nazwie Stitch. Ponieważ klienci (w znaczeniu przeglądarek internetowych i telefonów) nie powinni rozmawiać bezpośrednio z MongoDB (odbywa się to za pomocą kodu na serwerze), stworzyli bezserwerowy interfejs, z którym mogą współpracować Twoje aplikacje, gdybyś zdecydował się użyć ich rozwiązanie hostowane (Atlas). Z ich dokumentacji wynika, że ​​istnieje możliwa opcja synchronizacji.

W tym piśmie z grudnia 2018 r. Omówiono używanie React Native, Stitch i MongoDB w przykładowej aplikacji, a inne próbki są połączone w dokumencie ( https://www.mongodb.com/blog/post/building-ios-and-android-apps -with-the-mongodb-stitch-reag-native-sdk ).

Twilio Sync

Inną opcją synchronizacji NoSQL jest Synchronizacja Twilio. Z ich witryny: „Synchronizacja pozwala zarządzać stanem na dowolnej liczbie urządzeń w czasie rzeczywistym na dużą skalę bez konieczności obsługi jakiejkolwiek infrastruktury zaplecza”.

Patrzyłem na to jako alternatywę dla Firebase dla jednego z wyżej wymienionych projektów, szczególnie po rozmowie z obiema drużynami. Podobają mi się również inne narzędzia komunikacyjne i wykorzystałem je do aktualizacji SMS-ów z prostej aplikacji internetowej.


[Edytuj] Spędziłem trochę czasu z Realm odkąd to napisałem. Podoba mi się to, że nie muszę pisać interfejsu API w celu synchronizacji danych między aplikacją a serwerem, podobnie jak Firebase. Funkcje bezserwerowe również wydają się być bardzo pomocne w tych dwóch przypadkach, ograniczając ilość kodu zaplecza, który muszę napisać.

Uwielbiam elastyczność magazynu danych MongoDB, dlatego staje się moim wyborem po stronie serwera aplikacji internetowych i innych aplikacji wymagających połączenia.

Znalazłem RESTHeart , który tworzy bardzo prosty, skalowalny RESTful API dla MongoDB. Nie powinno być zbyt trudne zbudowanie komponentu React (Native), który odczytuje i zapisuje obiekty JSON w RESTHeart, który z kolei przekazuje je do / z MongoDB.


[Edytuj] Dodałem informacje o sposobie przechowywania danych. Czasami ważne jest, aby wiedzieć, ile pracy możesz wykonać podczas programowania i testowania, jeśli musisz poprawić i przetestować dane.


Edycje 2/2019 W ubiegłym roku (2018) eksperymentowałem z kilkoma z tych opcji, projektując projekt o wysokiej współbieżności. Niektóre z nich wspominają o twardych i miękkich limitach współbieżności w swojej dokumentacji (Firebase miał trudny do 10.000 połączeń, jak sądzę, podczas gdy Twilio był miękkim limitem, który można podnieść, zgodnie z dyskusjami z oboma zespołami w AltConf).

Jeśli projektujesz aplikację dla dziesiątek do setek tysięcy użytkowników, przygotuj się na odpowiednie skalowanie zaplecza danych.

Bryan Scott
źródło
1
a co z Redux?
HIRA THAKUR
4
@LeonardoDaCodinchi Redux byłby pomocny w zarządzaniu stanem, ale nie zapewnia trwałej funkcjonalności pamięci.
walshie4
1
dlaczego nie uporczywie redux na twojej liście? czy mógłbyś coś o tym dodać? jeśli jest tak źle.
Shahzad Mirza
Kiedy to napisałem, nie spędziłem czasu na przeglądaniu czegokolwiek związanego z Redux. Moje istniejące aplikacje React i React-Native (które mają już prawie dwa lata i są tylko w trybie konserwacji) nie używają go. Być może pojawi się w przyszłym projekcie, w którym to momencie mogę przedstawić uczciwy komentarz.
Bryan Scott
1
Uwielbiałem sposób, w jaki wszystko układasz. Byłoby lepiej, jeśli dodasz zalety i wady dla każdego z nich (również link do jego dokumentów). Jak się dowiedziałem, jeden z nich AsyncStorageobsługuje tylko 6 MB w Androidzie, podczas gdy w iOS nie ma takich ograniczeń.
Jimit Patel,
58

Szybkie i brudne: wystarczy użyć Redux + reagują-Redux + Redux-utrzymują + AsyncStorage dla reagują-rodzimy.

Pasuje niemal idealnie do reagującego rodzimego świata i działa jak urok zarówno dla Androida, jak i iOS. Poza tym wokół jest solidna społeczność i mnóstwo informacji.

Dla działającego przykładu zobacz F8App z Facebooka.

Jakie są różne opcje utrwalania danych?

Z React Native prawdopodobnie chcesz użyć redux i redux-persist. Może korzystać z wielu silników pamięci masowej. AsyncStorage i redux-persist-fileystem-storage są opcjami dla RN.

Istnieją inne opcje, takie jak Firebase lub Realm, ale nigdy nie korzystałem z nich w projekcie RN.

Jakie są granice tej trwałości dla każdego (tj. Kiedy dane nie są już dostępne)? Na przykład: po zamknięciu aplikacji, ponownym uruchomieniu telefonu itp.

Używając redux + redux-persist możesz zdefiniować, co jest utrwalane, a co nie. Jeśli nie zostanie utrwalony, dane istnieją podczas działania aplikacji. Po utrwaleniu dane pozostają między kolejnymi uruchomieniami aplikacji (zamykanie, otwieranie, ponowne uruchamianie telefonu itp.).

AsyncStorage ma domyślny limit 6 MB na Androida. Możliwe jest skonfigurowanie większego limitu (w kodzie Java) lub użycie pamięci masowej systemu plików redux-persist-system plików jako silnika pamięci dla Androida.

Czy dla każdego z nich istnieją różnice (inne niż ogólna konfiguracja) między implementacją w systemie iOS a systemem Android?

Używając redux + redux-persist + AsyncStorage, konfiguracja jest dokładnie taka sama na Androidzie i iOS.

Jak wyglądają opcje dostępu do danych offline? (lub jak zazwyczaj obsługiwany jest dostęp offline?)

Dzięki redux dostęp offiline jest prawie automatyczny dzięki częściom projektu (twórcom akcji i reduktorom).

Wszystkie dane, które pobrałeś i zapisałeś, są dostępne, możesz łatwo przechowywać dodatkowe dane, aby wskazać stan (pobieranie, sukces, błąd) i czas, w którym zostały pobrane. Zwykle żądanie pobrania nie unieważnia starszych danych, a komponenty aktualizują się po otrzymaniu nowych danych.

To samo dotyczy w innym kierunku. Możesz przechowywać dane, które wysyłasz na serwer i które są nadal w toku, i odpowiednio je obsługiwać.

Czy są jeszcze jakieś względy, o których powinienem pamiętać?

React promuje reaktywny sposób tworzenia aplikacji i Redux bardzo do niego pasuje. Powinieneś spróbować przed skorzystaniem z opcji, której używałbyś w swojej zwykłej aplikacji na Androida lub iOS. Ponadto znajdziesz znacznie więcej dokumentów i pomoc dla nich.

Filipe Borges
źródło
3
Dzięki za głębokie zanurzenie w AsyncStorage / Redux Persist. Szukałem bardziej przeglądu wszystkich opcji, więc to jedyny powód, dla którego nie wybrałem tego jako oficjalnej odpowiedzi.
Sia
9

Osoby powyżej trafiły w odpowiednie notatki do przechowywania, ale jeśli musisz również wziąć pod uwagę wszelkie dane PII, które muszą być przechowywane, możesz również ukryć się w pęku kluczy, używając czegoś takiego jak https://github.com/oblador/react-native-keychain ponieważ ASyncStorage jest niezaszyfrowany. Można go zastosować jako część konfiguracji trwałej w czymś takim jak redux-persist.

Jeff Chew
źródło
1

możesz użyć magazynu synchronizacji, który jest łatwiejszy w użyciu niż magazyn asynchroniczny. ta biblioteka jest świetna, wykorzystuje pamięć asynchroniczną do zapisywania danych asynchronicznie i wykorzystuje pamięć do ładowania i zapisywania danych natychmiast synchronicznie, więc zapisujemy dane asynchronicznie w pamięci i używamy w synchronizacji aplikacji, więc to świetnie.

import SyncStorage from 'sync-storage';

SyncStorage.set('foo', 'bar');
const result = SyncStorage.get('foo');
console.log(result); // 'bar'
sajad abbasi
źródło
1

możesz użyć Realm lub Sqlite, jeśli chcesz zarządzać złożonym typem danych.

W przeciwnym razie przejdź do wbudowanego reagowania na natywne asynstorage

sreerag
źródło
0

Nie potrzebujemy redux-persist, możemy po prostu użyć redux do przetrwania.

React-redux + AsyncStorage = redux-persist

więc wewnątrz pliku createotre wystarczy dodać te linie

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

zaktualizuje to AsyncStorage, ilekroć w sklepie redux pojawią się jakieś zmiany.

Następnie załaduj przekonwertowany sklep json. kiedy tylko aplikacja się ładuje. i ustaw sklep ponownie.

Ponieważ redux-persist stwarza problemy podczas korzystania z WIX React-Native-Navigation. Jeśli tak jest, wolę zastosować proste redux z powyższą funkcją subskrybenta

Rajender Dandyal
źródło