React Native kullanırken veri saklama seçeneklerim nelerdir? (iOS ve Android) [kapalı]


231

React Native dünyasında ve genellikle mobil / yerli dünyada da yeniyim ve veri kalıcılığı söz konusu olduğunda belgeleri biraz eksik buluyorum.

React Native'de veri saklama seçeneklerim ve her türün sonuçları nelerdir? Örneğin, yerel depolama ve zaman uyumsuz depolama olduğunu görüyorum, ancak daha sonra Realm gibi şeyleri de görüyorum ve tüm bunların bir dış veritabanı ile nasıl çalışacağı konusunda kafam karıştı.

Özellikle bilmek istiyorum:

  • Veri kalıcılığı için farklı seçenekler nelerdir?
  • Her biri için, bu kalıcılığın sınırları nelerdir (yani, veri artık ne zaman mevcut değildir)? Örneğin: uygulamayı kapatırken, telefonu yeniden başlatırken vb.
  • Her biri için, iOS ve Android'de uygulama arasında (genel kurulum dışında) farklılıklar var mı?
  • Seçenekler verilere çevrimdışı erişim için nasıl karşılaştırılır? (veya çevrimdışı erişim genellikle nasıl ele alınır?)
  • Aklımda tutmam gereken başka noktalar var mı?

Yardımınız için teşekkürler!


sensitie verilerini saklamak istiyorsanız, şuna göz atabilirsiniz: stackoverflow.com/questions/45547657/…
Julien Kode

sadece
Diyar'ı

Basit bir çözüm istiyorsanız back4app kullanın (ör. parse.com)
Fattie

15
SO'da olduğu gibi, çok sayıda insan için yararlı olan sorular birisi tarafından kapatılır ... belki de bu SO topluluğuna 'kurallar' ve nasıl uygulandıkları hakkında bir şeyler söylüyor olmalı? Tüm zamanların en çok kullanılan yayınlarına bakmayı ve kaç tanesinin 'kurallara' uyduğunu görün. Dinleyen var mı?
user2330237

Yanıtlar:


287

Mevcut uygulama projelerimden biriyle ilerlemenin en iyi yolunu belirlerken öğrendiklerim.

Eşzamansız Depolama (Yerel Yanıt Verme "yerleşik")

AsyncStorage'ı üretim içi bir uygulama için kullanıyorum. Depolama, cihazda yerel olarak kalır, şifrelenmez (başka bir cevapta belirtildiği gibi), uygulamayı silerseniz kaybolur, ancak cihazınızın yedeklerinin bir parçası olarak kaydedilmeli ve yükseltmeler sırasında devam etmelidir (CodePush aracılığıyla hem yerel yükseltmeler hem de kod yükseltmeleri ).

Sonuç: Yerel depolama; kendi senkronizasyon / yedekleme çözümünüzü sağlarsınız.

SQLite

Üzerinde çalıştığım diğer projeler uygulama depolaması için sqlite3 kullandılar. Bu, aygıta ve aygıttan da iletilebilen sıkıştırılabilir veritabanlarıyla SQL benzeri bir deneyim sunar. Onları bir arka uçla senkronize etme konusunda hiçbir deneyimim olmadı, ancak çeşitli kütüphanelerin var olduğunu hayal ediyorum. SQLite'a bağlanmak için RN kütüphaneleri vardır.

Veriler, veritabanına, tablolara, anahtarlara, dizinlere vb. Sahip geleneksel veritabanı biçiminizde depolanır ve tümü diske ikili biçimde kaydedilir. Verilere doğrudan erişim, komut satırı veya SQLite sürücüleri olan uygulamalar aracılığıyla kullanılabilir.

Sonuç: Yerel depolama; senkronizasyonu ve yedeklemeyi sağlarsınız.

Firebase

Firebase, diğer şeylerin yanı sıra, 1'den n'ye kadar istemciyi senkronize etmek için tasarlanmış bir JSON belge deposuyla (MongoDB gibi) gerçek zamanlı bir noSQL veritabanı sunar. Dokümanlar çevrimdışı kalıcılık hakkında konuşuyor, ancak yalnızca yerel kod için (Swift / Obj-C, Java). Google'ın React Native tarafından kullanılan kendi JavaScript seçeneği ("Web") önbelleğe alınmış bir depolama seçeneği sağlamaz (aşağıdaki 2/18 güncellemesine bakın). Kütüphane, bir web tarayıcısının bağlanacağı varsayımı ile yazılmıştır ve bu nedenle yarı kalıcı bir bağlantı olacaktır. Firebase depolama çağrılarını desteklemek için yerel bir önbellek mekanizması yazabilir veya yerel kütüphaneler ile React Native arasında bir köprü yazabilirsiniz.

Güncelleme 2/2018 O zamandan beriyerel iOS ve Android kütüphanelerine uyumlu bir JavaScript arayüzü sağlayan React Native Firebase'i buldum(Google'ın muhtemelen yapabileceği / yapması gerekeni yapıyor), size React bonusu ile yerel kütüphanelerin tüm güzelliklerini veriyor Yerel destek. Google'ın gerçek zamanlı veritabanının yanında bir JSON belge deposu tanıtmasıyla, Firebase'e oluşturmayı planladığım bazı gerçek zamanlı uygulamalar için ikinci iyi bir görünüm veriyorum.

Gerçek zamanlı veritabanı, web sitesinde düzenleyebileceğiniz ve oldukça basit bir şekilde içe / dışa aktarabileceğiniz JSON benzeri bir ağaç olarak saklanır.

Sonuç: Reat-native-firebase ile RN, Swift ve Java ile aynı faydaları elde eder. [/ update] Ağa bağlı cihazlar için iyi ölçeklendirilir. Düşük kullanım için düşük maliyet. Diğer Google bulut teklifleriyle güzel bir şekilde birleşir. Veriler arayüzlerinden kolayca görülebilir ve düzenlenebilir.

Diyar

Güncelleme 4/2020 MongoDB, Realm'i satın aldı ve MongoDB Stitch ile birleştirmeyi planlıyor (aşağıda tartışıldı). Bu çok heyecan verici görünüyor .


Ayrıca otomajik ağ senkronizasyonu ile gerçek zamanlı bir nesne deposu. Kendilerini "önce cihaz" olarak tanıtıyorlar ve demo video, cihazların düzensiz veya kayıplı ağ bağlantısını nasıl ele aldığını gösteriyor.

Kendi sunucularınızda veya AWS veya Azure gibi bir bulut çözümünde barındırdığınız nesne deposunun ücretsiz bir sürümünü sunarlar. Ayrıca, aygıtla birlikte kalıcı olmayan bellek içi depolar, sunucuyla senkronize olmayan yalnızca aygıt depoları, salt okunur sunucu depoları ve bir veya daha fazla aygıt arasında eşitleme için tam okuma-yazma seçeneği de oluşturabilirsiniz. Firebase'den ayda daha pahalıya mal olan profesyonel ve kurumsal seçeneklere sahipler.

Firebase'in aksine, tüm Realm yetenekleri tıpkı Swift / ObjC / Java (yerel) uygulamalarında olduğu gibi React Native ve Xamarin'de desteklenir.

Verileriniz kodunuzdaki nesnelere bağlıdır. Tanımlanmış nesneler oldukları için bir şemanız var ve kod kontrolü için sürüm kontrolü şarttır. Realm'in sağladığı GUI araçlarıyla doğrudan erişim mümkündür. Cihazdaki veri dosyaları platformlar arası uyumludur.

Sonuç: Önce cihaz, ücretsiz ve ücretli planlarla isteğe bağlı senkronizasyon. React Native'de desteklenen tüm özellikler. Yatay ölçeklendirme Firebase'den daha pahalıdır.

iCloud

Dürüst olmak gerekirse, bununla çok fazla oyun oynamadım, ancak yakın gelecekte yapacağım.

CloudKit kullanan yerel bir uygulamanız varsa, uygulamanızın kapsayıcılarına bir web uygulamasından (veya bizim durumumuzda React Native) bağlanmak için CloudKit JS'yi kullanabilirsiniz. Bu senaryoda, muhtemelen yerel bir iOS uygulamanız ve React Native Android uygulamanız olur.

Realm gibi, bu da verileri yerel olarak depolar ve mümkün olduğunda iCloud ile senkronize eder. Uygulamanız için genel mağazalar ve her müşteri için özel mağazalar vardır. Müşteriler bazı mağazalarını veya nesnelerini diğer kullanıcılarla paylaşmayı bile seçebilirler.

Ham verilere erişmenin ne kadar kolay olduğunu bilmiyorum; şemalar Apple'ın sitesinde kurulabilir.

Sonuç: Apple hedefli uygulamalar için idealdir.

Couchbase

Büyük isim, arkasında büyük şirketler var. Standart destek maliyetlerine sahip bir Topluluk Sürümü ve İşletme Sürümü vardır.

Sitelerinde React Native'a bir şeyler bağladıkları için bir eğitici var. Ben de bu konuda çok zaman harcadım, ama fonksiyonellik açısından Realm için uygun bir alternatif gibi görünüyor. Uygulamanızın veya oluşturduğunuz API'ların dışında verilerinize ulaşmanın ne kadar kolay olduğunu bilmiyorum.

[Düzenle: Couchbase ve CouchDB hakkında konuşan eski bir bağlantı bulundu ve CouchDB de dikkate alınması gereken başka bir seçenek olabilir. Bu ikisi tarihsel olarak birbiriyle ilişkilidir ancak şu anda tamamen farklı ürünlerdir. Bu karşılaştırmaya bakın .]

Sonuç: Realm ile benzer özelliklere sahip görünüyor. Yalnızca cihaz veya senkronize edilebilir. Denemem gerek.

MongoDB

4/2020 Güncellemesi

Mongo, Realm'i satın aldı ve MongoDB Stitch'i (aşağıda tartışıldı) Realm (yukarıda tartışıldı) ile birleştirmeyi planlıyor .


Yerel olarak AsyncStorage kullanan uygulamanın bir parçası için bu sunucu tarafını kullanıyorum. Her şeyin JSON nesneleri olarak depolanmasını seviyorum, bu da istemci cihazlara iletimi çok basit hale getiriyor. Benim kullanım durumumda, bir TV rehberi veri akış yukarı sağlayıcısı ve istemci aygıtlarım arasında bir önbellek olarak kullanılır.

Verilerin şema gibi sert bir yapısı yoktur, bu nedenle her nesne kolayca aranabilir, filtrelenebilir vb. Bir "belge" olarak saklanır. Benzer JSON nesneleri ek (ancak farklı) özniteliklere veya alt nesnelere sahip olabilir. Nesnelerinizi / verilerinizi nasıl yapılandırdığınız konusunda çok fazla esneklik.

Sunucu senkronizasyonu özellikleri için herhangi bir istemci denemedim ya da gömülü kullanmadım. React MongoDB için yerel kod mevcut.

Sonuç: Yalnızca yerel NoSQL çözümü, Realm veya Firebase gibi belirgin bir senkronizasyon seçeneği yoktur.

Güncelleme 2/2019

MongoDB'de Stitch adında bir "ürün" (veya hizmet) vardır. İstemciler (web tarayıcıları ve telefonlar anlamında) doğrudan MongoDB ile konuşmaması gerektiğinden (sunucunuzdaki kodla yapılır), uygulamalarınızı aralarından yararlanabileceğiniz sunucusuz bir ön uç oluşturdular. barındırılan çözüm (Atlas). Dokümanları, olası bir senkronizasyon seçeneği olduğunu gösteriyor.

Aralık 2018'deki bu yazıda, örnek bir uygulamada React Native, Stitch ve MongoDB'nin kullanılması, belgedeki diğer örneklerle ( https://www.mongodb.com/blog/post/building-ios-and-android-apps -mongodb-dikiş-tepki-doğal-sdk ile ).

Twilio Senkronizasyonu

Senkronizasyon için başka bir NoSQL seçeneği Twilio's Sync'dir. Sitelerinden: "Senkronizasyon, herhangi bir arka uç altyapısını işlemek zorunda kalmadan, herhangi bir sayıda cihazdaki durumu gerçek zamanlı olarak yönetmenizi sağlar."

Bunu, özellikle her iki ekiple konuştuktan sonra, yukarıda bahsedilen projelerden biri için Firebase'e bir alternatif olarak gördüm. Diğer iletişim araçlarını da seviyorum ve bunları basit bir web uygulamasından mesaj güncellemeleri için kullandım.


Bunu ilk yazdığımdan beri Realm ile biraz zaman geçirdim. Firebase'e benzer şekilde uygulama ve sunucu arasındaki verileri senkronize etmek için bir API yazmak zorunda olmadığımı seviyorum. Sunucusuz işlevler de yazmak zorunda olduğum arka uç kodu miktarını sınırlayarak bu iki ile gerçekten yararlı görünüyor.

MongoDB veri deposunun esnekliğini seviyorum, bu yüzden web tabanlı ve bağlantı gerektiren diğer uygulamaların sunucu tarafı için seçimim haline geliyor.

MongoDB için çok basit, ölçeklenebilir bir RESTful API oluşturan RESTHeart'ı buldum . JSON nesnelerini RESTHeart'a okuyan ve yazan bir React (Native) bileşeni oluşturmak çok zor olmamalı, bu da onları MongoDB'ye / MongoDB'den / 'den geçirir.


[Düzenle] Verilerin nasıl saklandığı hakkında bilgi ekledim. Bazen, verileri düzeltip test etmeniz gerekiyorsa, geliştirme ve test sırasında ne kadar işte olabileceğinizi bilmek önemlidir.


Düzenlemeler 2/2019 Geçen yıl (2018) yüksek eşzamanlı bir proje tasarlarken bu seçeneklerden birkaçını denedim . Bazıları belgelerinde sert ve yumuşak eşzamanlılık sınırlarından bahsediyorlar (Altebf'teki her iki ekiple yapılan tartışmalara göre, Twilio'nun çarpılabilecek yumuşak bir sınır olduğuna inanıyorum, Firebase'in 10.000 bağlantıda zor bir sınırı vardı).

On binlerce ila yüz binlerce kullanıcı için bir uygulama tasarlıyorsanız, veri arka ucunu buna göre ölçeklendirmeye hazır olun.


1
Peki ya Redux?
HIRA THAKUR

4
@LeonardoDaCodinchi Redux devlet yönetimi için yararlı olacaktır, ancak kalıcı depolama işlevselliği sağlamaz.
walshie4

1
neden listenizde kalıcı değil? bu konuda bir şeyler ekleyebilir misin? eğer o kadar kötü ise.
Shahzad Mirza

Bunu yazdığımda, Redux ile ilgili hiçbir şeye bakmak için hiç zaman harcamamıştım. Mevcut React ve React-Native uygulamalarım (neredeyse iki yaşında ve sadece bakım modunda) kullanmıyorum. Belki gelecekteki bir projede ortaya çıkacak, bu noktada adil bir yorum sunabilirim.
Bryan Scott

1
Her şeyi koyma şeklini sevdim. Her biri için artıları ve eksileri eklerseniz daha iyi olur (ayrıca belgelerinin bağlantısı). Bunun için bir tane bulduğum gibi AsyncStorageAndroid'de sadece 6 MB'yi desteklerken, iOS için böyle bir sınırlama yok.
Jimit Patel

58

Hızlı ve kirli: reaksiyona özgü için Redux + tepki-redux + redux-persist + AsyncStorage kullanın .

Reaksiyon yerli dünyasına neredeyse mükemmel uyum sağlar ve hem android hem de ios için bir cazibe gibi çalışır. Ayrıca, çevresinde sağlam bir topluluk ve bol miktarda bilgi var.

Çalışan bir örnek için Facebook'tan F8App'a bakın .

Veri kalıcılığı için farklı seçenekler nelerdir?

Doğal tepki ile, muhtemelen redux ve redux-persist kullanmak istersiniz. Birden fazla depolama motoru kullanabilir. AsyncStorage ve redux-persist-filesystem-storage RN için seçeneklerdir.

Firebase veya Realm gibi başka seçenekler de var, ancak bunları bir RN projesinde kullanmadım.

Her biri için, bu kalıcılığın sınırları nelerdir (yani, veri artık ne zaman mevcut değildir)? Örneğin: uygulamayı kapatırken, telefonu yeniden başlatırken vb.

Redux + redux-persist kullanarak neyin kalıcı ve neyin kalıcı olmadığını tanımlayabilirsiniz. Kalıcı olmadığında, uygulama çalışırken veriler bulunur. Kalıcı olduğunda, veriler uygulama yürütmeleri arasında kalır (kapat, aç, telefonu yeniden başlat, vb.).

AsyncStorage'ın Android'de varsayılan 6MB sınırı vardır. Daha büyük bir sınır yapılandırmak (Java kodunda) veya redux-persist-filesystem-storage'u Android için depolama motoru olarak kullanmak mümkündür.

Her biri için, iOS ve Android'de uygulama arasında (genel kurulum dışında) farklılıklar var mı?

Redux + redux-persist + AsyncStorage kullanarak kurulum, android ve iOS'ta tamamen aynıdır.

Seçenekler verilere çevrimdışı erişim için nasıl karşılaştırılır? (veya çevrimdışı erişim genellikle nasıl ele alınır?)

Redux kullanarak offiline erişim, tasarım parçaları (aksiyon yaratıcıları ve redüktörler) sayesinde neredeyse otomatiktir.

Getirdiğiniz ve sakladığınız tüm veriler kullanılabilir, durumu (getirme, başarı, hata) ve getirildiği zamanı belirtmek için kolayca fazladan veri depolayabilirsiniz. Normalde, getirme istemek eski verileri geçersiz kılmaz ve bileşenleriniz yeni veri alındığında güncellenir.

Aynısı diğer yönde de geçerlidir. Sunucuya gönderdiğiniz ve hala beklemede olan verileri depolayabilir ve buna göre işleyebilirsiniz.

Aklımda tutmam gereken başka noktalar var mı?

React, uygulamalar oluşturmanın reaktif bir yolunu destekler ve Redux buna çok iyi uyuyor. Normal Android veya iOS uygulamanızda kullanacağınız bir seçeneği kullanmadan önce denemelisiniz. Ayrıca, daha fazla doküman bulabilir ve bunlar için yardım alabilirsiniz.


3
AsyncStorage / Redux Persist'teki derin dalış için teşekkürler. Tüm seçeneklere genel bir bakış için bakıyordum, bu yüzden bunu resmi cevap olarak seçmememin tek nedeni bu.
Sia

9

Yukarıdaki kişiler depolamak için doğru notlara çarpıyorlar, ancak saklanması gereken PII verilerini de göz önünde bulundurmanız gerekiyorsa, https://github.com/oblador/react-native-keychain gibi bir şey kullanarak anahtarlığa da yerleştirebilirsiniz. ASyncStorage şifrelenmemiş olduğundan. Redux-persist gibi bir şeyde sürekli yapılandırmanın bir parçası olarak uygulanabilir.


1

zaman uyumsuz depolamaya göre kullanımı daha kolay olan senkronizasyon depolamasını kullanabilirsiniz. bu kütüphane, verileri eşzamansız olarak kaydetmek için zaman uyumsuz depolama alanı kullanır ve verileri anında senkronize olarak yüklemek ve kaydetmek için bellek kullanır, bu nedenle verileri belleğe zaman uyumsuz olarak kaydeder ve uygulama senkronizasyonunda kullanırız, bu yüzden bu harika.

import SyncStorage from 'sync-storage';

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

1

karmaşık veri türünü yönetmek istiyorsanız Realm veya Sqlite kullanabilirsiniz.

Aksi takdirde dahili reaksiyonlu asinstorage ile gidin


0

Redux-persist'a ihtiyacımız yok, sadece redux için sebat kullanabiliriz.

tepki-redux + AsyncStorage = redux-persist

içeride createotre dosyası sadece bu satırları ekleyin

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

bu, redux deposunda bazı değişiklikler olduğunda AsyncStorage'ı güncelleyecektir.

Sonra json dönüştürülmüş mağaza yükleyin. uygulama yüklendiğinde. ve mağazayı tekrar ayarlayın.

Çünkü redux-persist, wix tepki-yerel gezinme kullanılırken sorunlar yaratır. Bu durumda yukarıdaki abone işleviyle basit redux kullanmayı tercih ederim

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.