Apa pilihan saya untuk menyimpan data saat menggunakan React Native? (iOS dan Android) [ditutup]

230

Saya masih baru di dunia Bereaksi Asli, dan umumnya di dunia mobile / asli juga, dan saya menemukan dokumentasi sedikit kurang ketika datang ke kegigihan data.

Apa pilihan saya untuk menyimpan data dalam Bereaksi Asli dan implikasi dari masing-masing jenis? Sebagai contoh, saya melihat bahwa ada penyimpanan lokal dan penyimpanan async, tetapi kemudian saya juga melihat hal-hal seperti Realm, dan saya bingung bagaimana semua ini akan bekerja dengan database luar.

Saya secara khusus ingin tahu:

  • Apa sajakah pilihan berbeda untuk kegigihan data?
  • Untuk masing-masing, apa batas dari kegigihan itu (yaitu, kapan data tidak lagi tersedia)? Misalnya: ketika menutup aplikasi, me-restart telepon, dll.
  • Untuk masing-masing, apakah ada perbedaan (selain pengaturan umum) antara penerapan di iOS vs Android?
  • Bagaimana perbandingan opsi untuk mengakses data offline? (atau bagaimana biasanya akses offline ditangani?)
  • Apakah ada pertimbangan lain yang harus saya ingat?

Terima kasih atas bantuan Anda!

Sia
sumber
jika Anda ingin menyimpan data sensitif, Anda dapat melihatnya di: stackoverflow.com/questions/45547657/…
Julien Kode
cukup gunakan Realm jelas
Fattie
cukup gunakan back4app jika Anda menginginkan solusi sederhana (yaitu, parse.com)
Fattie
15
Seperti yang sering terjadi pada SO, pertanyaan yang bermanfaat bagi banyak orang ditutup oleh seseorang ... mungkin ini harus memberi tahu komunitas SO sesuatu tentang 'aturan' dan bagaimana mereka diterapkan? Coba lihat posting yang paling sering digunakan dan lihat berapa banyak yang mengikuti 'aturan'. Adakah yang mendengarkan?
user2330237

Jawaban:

287

Inilah yang saya pelajari ketika saya menentukan cara terbaik untuk bergerak maju dengan beberapa proyek aplikasi saya saat ini.

Async Storage ("bawaan" untuk Bereaksi Asli)

Saya menggunakan AsyncStorage untuk aplikasi dalam produksi. Penyimpanan tetap lokal ke perangkat, tidak dienkripsi (seperti yang disebutkan dalam jawaban lain), hilang jika Anda menghapus aplikasi, tetapi harus disimpan sebagai bagian dari cadangan perangkat Anda dan tetap ada selama peningkatan (baik pembaruan asli ala TestFlight dan peningkatan kode melalui CodePush ).

Kesimpulan: Penyimpanan lokal; Anda memberikan solusi sinkronisasi / cadangan Anda sendiri.

SQLite

Proyek lain yang saya kerjakan telah menggunakan sqlite3 untuk penyimpanan aplikasi. Ini memberi Anda pengalaman seperti SQL, dengan database kompresibel yang juga dapat dikirim ke dan dari perangkat. Saya belum punya pengalaman dengan menyinkronkannya ke bagian belakang, tapi saya membayangkan berbagai perpustakaan ada. Ada pustaka RN untuk menghubungkan ke SQLite.

Data disimpan dalam format database tradisional Anda dengan database, tabel, kunci, indeks, dll. Semua disimpan ke disk dalam format biner. Akses langsung ke data tersedia melalui baris perintah atau aplikasi yang memiliki driver SQLite.

Kesimpulan: Penyimpanan lokal; Anda memberikan sinkronisasi dan cadangan.

Firebase

Firebase menawarkan, antara lain, database noSQL waktu nyata bersama dengan toko dokumen JSON (seperti MongoDB) yang dimaksudkan untuk menjaga dari 1 hingga n jumlah klien yang disinkronkan. Dokumen berbicara tentang kegigihan offline, tetapi hanya untuk kode asli (Swift / Obj-C, Java). Opsi JavaScript milik Google ("Web") yang digunakan oleh React Native tidak menyediakan opsi penyimpanan yang di-cache (lihat pembaruan 2/18 di bawah). Perpustakaan ditulis dengan asumsi bahwa browser web akan terhubung, sehingga akan ada koneksi semi-persisten. Anda mungkin bisa menulis mekanisme caching lokal untuk menambah panggilan penyimpanan Firebase, atau Anda bisa menulis jembatan antara perpustakaan asli dan React Native.

Pembaruan 2/2018 Sejak saat itu saya menemukan React Native Firebase yang menyediakan antarmuka JavaScript yang kompatibel ke perpustakaan asli iOS dan Android (melakukan apa yang mungkin / seharusnya dilakukan oleh Google), memberi Anda semua kebaikan perpustakaan asli dengan bonus React Dukungan asli. Dengan diperkenalkannya toko dokumen JSON di samping basis data waktu-nyata, saya memberi Firebase tampilan kedua yang bagus untuk beberapa aplikasi waktu-nyata yang saya rencanakan untuk dibangun.

Basis data waktu nyata disimpan sebagai pohon mirip JSON yang dapat Anda edit di situs web dan impor / ekspor dengan mudah.

Kesimpulan: Dengan reaksi-asli-firebase, RN mendapatkan manfaat yang sama seperti Swift dan Java. [/ perbarui] Skala baik untuk perangkat yang terhubung ke jaringan. Biaya rendah untuk pemanfaatan rendah. Menggabungkan dengan baik dengan penawaran cloud Google lainnya. Data mudah terlihat dan dapat diedit dari antarmuka mereka.

Dunia

Pembaruan 4/2020 MongoDB telah mengakuisisi Realm dan berencana untuk menggabungkannya dengan Stitch MongoDB (dibahas di bawah). Ini terlihat sangat menarik .


Juga penyimpanan objek waktu nyata dengan sinkronisasi jaringan automagic. Mereka menggembar-gemborkan diri sebagai "perangkat pertama" dan video demo menunjukkan bagaimana perangkat menangani konektivitas jaringan sporadis atau lossy.

Mereka menawarkan versi gratis dari penyimpanan objek yang Anda host di server Anda sendiri atau dalam solusi cloud seperti AWS atau Azure. Anda juga dapat membuat penyimpanan dalam-memori yang tidak bertahan dengan perangkat, penyimpanan hanya-perangkat yang tidak disinkronkan dengan server, penyimpanan server baca-saja, dan opsi baca-tulis penuh untuk sinkronisasi di satu atau beberapa perangkat. Mereka memiliki opsi profesional dan perusahaan yang harganya lebih tinggi di muka per bulan daripada Firebase.

Tidak seperti Firebase, semua kemampuan Realm didukung di React Native dan Xamarin, seperti halnya mereka ada di aplikasi Swift / ObjC / Java (asli).

Data Anda terkait dengan objek dalam kode Anda. Karena mereka adalah objek yang didefinisikan, Anda memiliki skema, dan kontrol versi adalah suatu keharusan untuk kewarasan kode. Akses langsung tersedia melalui alat GUI yang disediakan Realm. File data pada perangkat kompatibel dengan lintas platform.

Kesimpulan: Perangkat pertama, sinkronisasi opsional dengan paket gratis dan berbayar. Semua fitur yang didukung di Bereaksi Asli. Penskalaan horizontal lebih mahal daripada Firebase.

iCloud

Jujur saya belum banyak bermain dengan yang satu ini, tetapi akan melakukannya dalam waktu dekat.

Jika Anda memiliki aplikasi asli yang menggunakan CloudKit, Anda dapat menggunakan CloudKit JS untuk terhubung ke wadah aplikasi Anda dari aplikasi web (atau, dalam kasus kami, React Native). Dalam skenario ini, Anda mungkin akan memiliki aplikasi iOS asli dan aplikasi Android Bereaksi Asli.

Seperti Realm, ini menyimpan data secara lokal dan menyinkronkannya ke iCloud jika memungkinkan. Ada toko publik untuk aplikasi Anda dan toko pribadi untuk setiap pelanggan. Pelanggan bahkan dapat memilih untuk berbagi beberapa toko atau benda mereka dengan pengguna lain.

Saya tidak tahu betapa mudahnya mengakses data mentah; skema dapat diatur di situs Apple.

Kesimpulan: Bagus untuk aplikasi yang ditargetkan Apple.

Couchbase

Nama besar, banyak perusahaan besar di belakangnya. Ada Edisi Komunitas dan Edisi Perusahaan dengan biaya dukungan standar.

Mereka punya tutorial di situs mereka untuk menghubungkan semuanya dengan React Native. Saya juga belum menghabiskan banyak waktu untuk yang ini, tetapi tampaknya menjadi alternatif yang layak untuk Realm dalam hal fungsionalitas. Saya tidak tahu betapa mudahnya mendapatkan data Anda di luar aplikasi Anda atau API apa pun yang Anda buat.

[Sunting: Menemukan tautan yang lebih tua yang berbicara tentang Couchbase dan CouchDB, dan CouchDB mungkin merupakan pilihan lain untuk dipertimbangkan. Keduanya secara historis terkait tetapi produk saat ini sama sekali berbeda. Lihat perbandingan ini .]

Kesimpulan: Tampaknya memiliki kemampuan yang sama dengan Realm. Bisa khusus perangkat atau disinkronkan. Saya perlu mencobanya.

MongoDB

Perbarui 4/2020

Mongo memperoleh Realm dan berencana untuk menggabungkan Stitch MongoDB (dibahas di bawah) dengan Realm (dibahas di atas).


Saya menggunakan sisi server ini untuk aplikasi yang menggunakan AsyncStorage secara lokal. Saya suka bahwa semuanya disimpan sebagai objek JSON, membuat transmisi ke perangkat klien sangat mudah. Dalam kasus penggunaan saya, ini digunakan sebagai cache antara penyedia data panduan TV hulu dan perangkat klien saya.

Tidak ada struktur keras pada data, seperti skema, sehingga setiap objek disimpan sebagai "dokumen" yang mudah dicari, difilter, dll. Objek JSON serupa dapat memiliki atribut tambahan (tetapi berbeda) atau objek anak, memungkinkan untuk banyak fleksibilitas dalam bagaimana Anda menyusun objek / data Anda.

Saya belum mencoba fitur sinkronisasi klien ke server, dan saya juga belum menggunakannya. Bereaksi kode asli untuk MongoDB memang ada.

Kesimpulan: Hanya solusi NoSQL lokal, tidak ada opsi sinkronisasi yang jelas seperti Realm atau Firebase.

Pembaruan 2/2019

MongoDB memiliki "produk" (atau layanan) yang disebut Stitch. Karena klien (dalam arti browser web dan telepon) tidak boleh berbicara langsung dengan MongoDB (yang dilakukan dengan kode pada server Anda), mereka menciptakan front-end serverless yang dapat berinteraksi dengan aplikasi Anda, jika Anda memilih untuk menggunakan mereka solusi yang di-host (Atlas). Dokumentasi mereka membuatnya tampak bahwa ada opsi sinkronisasi yang mungkin.

Tulisan ini dari Desember 2018 membahas penggunaan React Native, Stitch, dan MongoDB dalam aplikasi sampel, dengan sampel lain yang ditautkan dalam dokumen ( https://www.mongodb.com/blog/post/building-ios-and-android-apps -dengan-mongodb-stitch-react-native-sdk ).

Sinkronisasi Twilio

Opsi NoSQL lain untuk sinkronisasi adalah Sinkronisasi Twilio. Dari situsnya: "Sinkronisasi memungkinkan Anda mengelola status di sejumlah perangkat dalam skala waktu nyata tanpa harus menangani infrastruktur backend apa pun."

Saya melihat ini sebagai alternatif Firebase untuk salah satu proyek yang disebutkan di atas, terutama setelah berbicara dengan kedua tim. Saya juga suka alat komunikasi mereka yang lain, dan telah menggunakannya untuk mengirim SMS pembaruan dari aplikasi web sederhana.


[Sunting] Saya telah menghabiskan waktu dengan Realm sejak saya menulis ini. Saya suka bagaimana saya tidak harus menulis API untuk menyinkronkan data antara aplikasi dan server, mirip dengan Firebase. Fungsi serverless juga terlihat sangat membantu dengan keduanya, membatasi jumlah kode backend yang harus saya tulis.

Saya suka fleksibilitas penyimpanan data MongoDB, sehingga menjadi pilihan saya untuk sisi server aplikasi berbasis web dan aplikasi lain yang diperlukan koneksi.

Saya menemukan RESTHeart , yang menciptakan API TENANG yang sangat sederhana dan dapat diukur ke MongoDB. Seharusnya tidak terlalu sulit untuk membangun komponen Bereaksi (Asli) yang membaca dan menulis objek JSON ke RESTHeart, yang pada gilirannya meneruskannya ke / dari MongoDB.


[Sunting] Saya menambahkan info tentang bagaimana data disimpan. Terkadang penting untuk mengetahui seberapa banyak pekerjaan yang mungkin Anda jalani selama pengembangan dan pengujian jika Anda harus mengubah dan menguji data.


Sunting 2/2019 Saya bereksperimen dengan beberapa opsi ini ketika merancang proyek konkurensi tinggi tahun lalu (2018). Beberapa dari mereka menyebutkan batas konkurensi keras dan lunak dalam dokumentasi mereka (Firebase memiliki yang sulit di 10.000 koneksi, saya percaya, sementara Twilio's adalah batas lunak yang dapat ditabrak, menurut diskusi dengan kedua tim di AltConf).

Jika Anda mendesain aplikasi untuk puluhan hingga ratusan ribu pengguna, bersiaplah untuk skala backend data yang sesuai.

Bryan Scott
sumber
1
nah bagaimana dengan Redux?
HIRA THAKUR
4
@LeonardoDaCodinchi Redux akan sangat membantu untuk manajemen negara tetapi tidak menyediakan fungsionalitas penyimpanan yang persisten.
walshie4
1
mengapa tidak redux-persisten di daftar Anda? bisakah Anda menambahkan sesuatu tentang itu? jika itu buruk.
Shahzad Mirza
Ketika saya menulis ini, saya tidak menghabiskan waktu untuk melihat apa pun yang berhubungan dengan Redux. Aplikasi React dan React-Native saya yang sudah ada (yang hampir dua tahun sekarang dan hanya dalam mode pemeliharaan) tidak menggunakannya. Mungkin dalam proyek masa depan itu akan muncul, pada titik mana saya dapat menawarkan beberapa komentar yang adil.
Bryan Scott
1
Saya suka cara Anda meletakkan segalanya. Akan lebih baik jika Anda menambahkan pro dan kontra untuk masing-masing (juga tautan dokumen-dokumen itu). Seperti saya temukan satu untuk AsyncStorageyang mendukung hanya 6 MB di Android sedangkan untuk iOS tidak ada batasan seperti itu.
Jimit Patel
58

Cepat dan kotor: hanya menggunakan Redux + bereaksi-redux + redux-bertahan + AsyncStorage untuk bereaksi-pribumi.

Ini pas hampir sempurna di dunia asli bereaksi dan bekerja seperti pesona untuk android dan ios. Juga, ada komunitas yang solid di sekitarnya, dan banyak informasi.

Untuk contoh yang berfungsi, lihat F8App dari Facebook.

Apa sajakah pilihan berbeda untuk kegigihan data?

Dengan reaksi asli, Anda mungkin ingin menggunakan redux dan redux-persist. Itu dapat menggunakan beberapa mesin penyimpanan. AsyncStorage dan redux-persist-filesystem-storage adalah opsi untuk RN.

Ada opsi lain seperti Firebase atau Realm, tetapi saya tidak pernah menggunakannya pada proyek RN.

Untuk masing-masing, apa batas dari kegigihan itu (yaitu, kapan data tidak lagi tersedia)? Misalnya: ketika menutup aplikasi, me-restart telepon, dll.

Menggunakan redux + redux-persist Anda dapat menentukan apa yang bertahan dan apa yang tidak. Ketika tidak ada, data ada saat aplikasi sedang berjalan. Saat bertahan, data tetap ada di antara eksekusi aplikasi (tutup, buka, restart ponsel, dll).

AsyncStorage memiliki batas default 6MB untuk Android. Dimungkinkan untuk mengkonfigurasi batas yang lebih besar (pada kode Java) atau menggunakan redux-persist-filesystem-storage sebagai mesin penyimpanan untuk Android.

Untuk masing-masing, apakah ada perbedaan (selain pengaturan umum) antara penerapan di iOS vs Android?

Menggunakan redux + redux-persist + AsyncStorage pengaturannya persis sama di android dan iOS.

Bagaimana perbandingan opsi untuk mengakses data offline? (atau bagaimana biasanya akses offline ditangani?)

Menggunakan redux, akses offiline hampir otomatis berkat bagian desainnya (pencipta aksi dan reduksi).

Semua data yang Anda ambil dan simpan tersedia, Anda dapat dengan mudah menyimpan data tambahan untuk menunjukkan status (pengambilan, keberhasilan, kesalahan) dan waktu pengambilan. Biasanya, meminta pengambilan tidak akan membatalkan data yang lebih lama dan komponen Anda hanya diperbarui ketika data baru diterima.

Hal yang sama berlaku di arah lain. Anda dapat menyimpan data yang Anda kirim ke server dan yang masih tertunda dan menanganinya sesuai.

Apakah ada pertimbangan lain yang harus saya ingat?

Bereaksi mempromosikan cara reaktif untuk membuat aplikasi dan Redux sangat cocok dengannya. Anda harus mencobanya sebelum hanya menggunakan opsi yang akan Anda gunakan di aplikasi Android atau iOS biasa. Juga, Anda akan menemukan lebih banyak dokumen dan bantuan untuk itu.

Filipe Borges
sumber
3
Terima kasih untuk penyelaman mendalam di AsyncStorage / Redux Persist. Saya mencari lebih banyak gambaran umum dari semua opsi, jadi itu satu-satunya alasan saya tidak memilih ini sebagai jawaban resmi.
Sia
9

Orang-orang di atas mengenai catatan yang tepat untuk penyimpanan, meskipun jika Anda juga perlu mempertimbangkan data PII yang perlu disimpan maka Anda juga dapat menyimpan ke gantungan kunci menggunakan sesuatu seperti https://github.com/oblador/react-native-keychain karena ASyncStorage tidak terenkripsi. Itu dapat diterapkan sebagai bagian dari konfigurasi persisihan dalam sesuatu seperti redux-persist.

Jeff Chew
sumber
1

Anda dapat menggunakan penyimpanan sinkronisasi yang lebih mudah digunakan daripada penyimpanan async. perpustakaan ini hebat yang menggunakan penyimpanan async untuk menyimpan data secara tidak sinkron dan menggunakan memori untuk memuat dan menyimpan data secara instan secara sinkron, jadi kami menyimpan data async ke memori dan digunakan dalam sinkronisasi aplikasi, jadi ini sangat bagus.

import SyncStorage from 'sync-storage';

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

Anda dapat menggunakan Realm atau Sqlite jika Anda ingin mengelola tipe data yang kompleks.

Kalau tidak pergi dengan inbuilt bereaksi asynstorage asli

sreerag
sumber
0

Kita tidak perlu redux-bertahan kita cukup menggunakan redux untuk ketekunan.

react-redux + AsyncStorage = redux-persist

jadi di dalam file createotre cukup tambahkan baris ini

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

ini akan memperbarui AsyncStorage setiap kali ada beberapa perubahan di toko redux.

Kemudian muat toko json yang dikonversi. kapan saja aplikasi dimuat. dan mengatur toko lagi.

Karena redux-bertahan menciptakan masalah ketika menggunakan wix react-native-navigation. Jika itu yang terjadi maka saya lebih suka menggunakan redux sederhana dengan fungsi pelanggan di atas

Rajender Dandyal
sumber