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.