Tùy chọn của tôi để lưu trữ dữ liệu khi sử dụng React Native là gì? (iOS và Android) [đã đóng]


230

Tôi vẫn còn mới trong thế giới React Native, và nói chung là trong thế giới di động / bản địa, và tôi đang tìm tài liệu hơi thiếu khi nói đến sự kiên trì dữ liệu.

Các tùy chọn của tôi để lưu trữ dữ liệu trong React Native và ý nghĩa của từng loại là gì? Ví dụ, tôi thấy rằng có lưu trữ cục bộ và lưu trữ không đồng bộ, nhưng sau đó tôi cũng thấy những thứ như Realm và tôi bối rối không biết tất cả những thứ này sẽ hoạt động như thế nào với cơ sở dữ liệu bên ngoài.

Tôi đặc biệt muốn biết:

  • Các tùy chọn khác nhau cho sự kiên trì dữ liệu là gì?
  • Đối với mỗi, các giới hạn của sự kiên trì đó là gì (nghĩa là khi nào dữ liệu không còn nữa)? Ví dụ: khi đóng ứng dụng, khởi động lại điện thoại, v.v.
  • Đối với mỗi loại, có sự khác biệt (ngoài thiết lập chung) giữa việc triển khai trong iOS và Android không?
  • Làm thế nào để các tùy chọn so sánh để truy cập dữ liệu ngoại tuyến? (hoặc cách truy cập ngoại tuyến thường được xử lý?)
  • Có bất kỳ cân nhắc nào khác tôi nên ghi nhớ?

Cảm ơn bạn đã giúp đỡ!


nếu bạn muốn lưu trữ dữ liệu nhạy cảm, bạn có thể xem cái này: stackoverflow.com/questions/45547657/ chủ
Julien Kode

chỉ cần sử dụng Realm rõ ràng
Fattie

chỉ cần sử dụng back4app nếu bạn muốn một giải pháp đơn giản (ví dụ: parse.com)
Fattie

15
Như thường thấy trên SO, các câu hỏi hữu ích cho số lượng lớn người bị đóng bởi ai đó ... có lẽ điều này nên nói với cộng đồng SO một cái gì đó về 'các quy tắc' và cách chúng được áp dụng? Hãy thử nhìn vào các bài đăng được sử dụng nhiều nhất mọi thời đại và xem có bao nhiêu người tuân theo 'các quy tắc'. Có ai nghe không?
dùng2330237

Câu trả lời:


287

Đây là những gì tôi đã học được khi xác định cách tốt nhất để tiến lên với một vài dự án ứng dụng hiện tại của mình.

Lưu trữ Async ("tích hợp" để React Native)

Tôi sử dụng AsyncStorage cho một ứng dụng đang sản xuất. Dung lượng lưu trữ cục bộ trên thiết bị, không được mã hóa (như được đề cập trong câu trả lời khác), sẽ biến mất nếu bạn xóa ứng dụng, nhưng nên được lưu như một phần của bản sao lưu và duy trì trong quá trình nâng cấp (cả nâng cấp gốc ala TestFlight và nâng cấp mã qua CodePush ).

Kết luận: Lưu trữ cục bộ; bạn cung cấp giải pháp đồng bộ / sao lưu của riêng bạn.

SQLite

Các dự án khác mà tôi đã làm việc đã sử dụng sqlite3 để lưu trữ ứng dụng. Điều này mang lại cho bạn trải nghiệm giống như SQL, với cơ sở dữ liệu có thể nén cũng có thể được truyền đến và từ thiết bị. Tôi chưa có bất kỳ kinh nghiệm nào về việc đồng bộ hóa chúng với mặt sau, nhưng tôi tưởng tượng các thư viện khác nhau tồn tại. Có thư viện RN để kết nối với SQLite.

Dữ liệu được lưu trữ ở định dạng cơ sở dữ liệu truyền thống của bạn với cơ sở dữ liệu, bảng, khóa, chỉ mục, v.v ... tất cả được lưu vào đĩa ở định dạng nhị phân. Truy cập trực tiếp vào dữ liệu có sẵn thông qua dòng lệnh hoặc ứng dụng có trình điều khiển SQLite.

Kết luận: Lưu trữ cục bộ; bạn cung cấp đồng bộ hóa và sao lưu.

Căn cứ hỏa lực

Firebase cung cấp, trong số những thứ khác, cơ sở dữ liệu noQuery thời gian thực cùng với kho lưu trữ tài liệu JSON (như MongoDB) có nghĩa là để giữ cho từ 1 đến n số lượng máy khách được đồng bộ hóa. Các tài liệu nói về sự kiên trì ngoại tuyến, nhưng chỉ dành cho mã gốc (Swift / Obj-C, Java). Tùy chọn JavaScript riêng của Google ("Web") được React Native sử dụng không cung cấp tùy chọn lưu trữ được lưu trong bộ nhớ cache (xem bản cập nhật 2/18 bên dưới). Thư viện được viết với giả định rằng một trình duyệt web sẽ được kết nối, và do đó sẽ có một kết nối bán liên tục. Bạn có thể có thể viết một cơ chế lưu trữ cục bộ để bổ sung các cuộc gọi lưu trữ Firebase hoặc bạn có thể viết một cầu nối giữa các thư viện gốc và React Native.

Cập nhật 2/2018 Tôi đã tìm thấy React Native Firebase cung cấp giao diện JavaScript tương thích với thư viện iOS và Android gốc (làm những gì Google có thể / nên làm), mang đến cho bạn tất cả những ưu điểm của thư viện gốc với phần thưởng của React Hỗ trợ bản địa. Với việc giới thiệu kho lưu trữ tài liệu JSON của Google bên cạnh cơ sở dữ liệu thời gian thực, tôi sẽ mang đến cho Firebase một cái nhìn tốt thứ hai về một số ứng dụng thời gian thực mà tôi dự định xây dựng.

Cơ sở dữ liệu thời gian thực được lưu trữ dưới dạng cây giống như JSON mà bạn có thể chỉnh sửa trên trang web và nhập / xuất khá đơn giản.

Kết luận: Với phản ứng gốc tự nhiên, RN nhận được lợi ích tương tự như Swift và Java. [/ update] Cân tốt cho các thiết bị kết nối mạng. Chi phí thấp cho việc sử dụng thấp. Kết hợp độc đáo với các dịch vụ đám mây khác của Google. Dữ liệu dễ dàng nhìn thấy và có thể chỉnh sửa từ giao diện của họ.

Vương quốc

Cập nhật 4/2020 MongoDB đã mua lại Realm và đang lên kế hoạch kết hợp nó với MongoDB Stitch (thảo luận bên dưới). Điều này có vẻ rất thú vị .


Cũng là một cửa hàng đối tượng thời gian thực với đồng bộ hóa mạng tự động. Họ tự quảng cáo là "thiết bị đầu tiên" và video demo cho thấy cách các thiết bị xử lý kết nối mạng rời rạc hoặc mất mát.

Họ cung cấp một phiên bản miễn phí của cửa hàng đối tượng mà bạn lưu trữ trên máy chủ của riêng bạn hoặc trong một giải pháp đám mây như AWS hoặc Azure. Bạn cũng có thể tạo các cửa hàng trong bộ nhớ không tồn tại với thiết bị, các cửa hàng chỉ dành cho thiết bị không đồng bộ hóa với máy chủ, lưu trữ máy chủ chỉ đọc và tùy chọn đọc ghi đầy đủ để đồng bộ hóa trên một hoặc nhiều thiết bị. Họ có các tùy chọn chuyên nghiệp và doanh nghiệp có chi phí cao hơn mỗi tháng so với Firebase.

Không giống như Firebase, tất cả các khả năng của Realm đều được hỗ trợ trong React Native và Xamarin, giống như trong các ứng dụng Swift / ObjC / Java (bản địa).

Dữ liệu của bạn được gắn với các đối tượng trong mã của bạn. Vì chúng là các đối tượng được xác định, nên bạn có một lược đồ và kiểm soát phiên bản là điều bắt buộc đối với sự tỉnh táo của mã. Truy cập trực tiếp có sẵn thông qua các công cụ GUI Realm cung cấp. Các tệp dữ liệu trên thiết bị tương thích đa nền tảng.

Kết luận: Thiết bị đầu tiên, đồng bộ hóa tùy chọn với các gói miễn phí và trả phí. Tất cả các tính năng được hỗ trợ trong React Native. Mở rộng quy mô ngang đắt hơn Firebase.

iCloud

Tôi thực sự đã không chơi nhiều với cái này, nhưng sẽ làm như vậy trong tương lai gần.

Nếu bạn có một ứng dụng gốc sử dụng CloudKit, bạn có thể sử dụng CloudKit JS để kết nối với các thùng chứa ứng dụng của bạn từ một ứng dụng web (hoặc, trong trường hợp của chúng tôi, React Native). Trong trường hợp này, có lẽ bạn sẽ có ứng dụng iOS gốc và ứng dụng React Native Android.

Giống như Realm, điều này lưu trữ dữ liệu cục bộ và đồng bộ hóa nó với iCloud khi có thể. Có các cửa hàng công cộng cho ứng dụng của bạn và các cửa hàng tư nhân cho mỗi khách hàng. Khách hàng thậm chí có thể chọn chia sẻ một số cửa hàng hoặc đối tượng của họ với người dùng khác.

Tôi không biết việc truy cập dữ liệu thô dễ dàng như thế nào; các lược đồ có thể được thiết lập trên trang web của Apple.

Kết luận: Tuyệt vời cho các ứng dụng nhắm mục tiêu của Apple.

Couchbase

Tên lớn, rất nhiều công ty lớn đằng sau nó. Có phiên bản Cộng đồng và Phiên bản doanh nghiệp với chi phí hỗ trợ tiêu chuẩn.

Họ đã có một hướng dẫn trên trang web của mình để kết nối mọi thứ với React Native. Tôi cũng không dành nhiều thời gian cho cái này, nhưng nó có vẻ là một sự thay thế khả thi cho Realm về chức năng. Tôi không biết việc truy cập dữ liệu của bạn bên ngoài ứng dụng của bạn dễ dàng như thế nào hoặc bất kỳ API nào bạn xây dựng.

[Chỉnh sửa: Tìm thấy một liên kết cũ hơn nói về Couchbase và CouchDB và CouchDB có thể là một lựa chọn khác để xem xét. Hai là liên quan đến lịch sử nhưng hiện tại sản phẩm hoàn toàn khác nhau. Xem so sánh này .]

Kết luận: Có vẻ như có khả năng tương tự như Vương quốc. Có thể chỉ dành cho thiết bị hoặc được đồng bộ hóa. Tôi cần phải thử nó.

MongoDB

Cập nhật 4/2020

Mongo mua lại Realm và có kế hoạch kết hợp MongoDB Stitch (thảo luận bên dưới) với Realm (đã thảo luận ở trên).


Tôi đang sử dụng phía máy chủ này cho một phần của ứng dụng sử dụng AsyncStorage cục bộ. Tôi thích rằng mọi thứ được lưu trữ dưới dạng các đối tượng JSON, khiến việc truyền đến các thiết bị khách rất đơn giản. Trong trường hợp sử dụng của tôi, nó được sử dụng làm bộ đệm giữa nhà cung cấp dữ liệu hướng dẫn truyền hình và các thiết bị khách của tôi.

Không có cấu trúc cứng cho dữ liệu, như lược đồ, vì vậy mọi đối tượng được lưu trữ dưới dạng "tài liệu" có thể dễ dàng tìm kiếm, có thể lọc, v.v. Các đối tượng JSON tương tự có thể có các thuộc tính hoặc đối tượng con bổ sung (nhưng khác nhau), cho phép rất linh hoạt trong cách bạn cấu trúc các đối tượng / dữ liệu của bạn.

Tôi chưa thử bất kỳ tính năng đồng bộ hóa máy khách nào với máy chủ, tôi cũng chưa sử dụng nó được nhúng. Phản ứng mã gốc cho MongoDB không tồn tại.

Kết luận: Giải pháp NoQuery cục bộ duy nhất, không có tùy chọn đồng bộ rõ ràng như Realm hoặc Firebase.

Cập nhật 2/2019

MongoDB có một "sản phẩm" (hoặc dịch vụ) được gọi là Stitch. Vì các máy khách (theo nghĩa của trình duyệt web và điện thoại) không nên nói chuyện trực tiếp với MongoDB (được thực hiện bằng mã trên máy chủ của bạn), nên chúng đã tạo một giao diện không có máy chủ mà ứng dụng của bạn có thể giao tiếp, nên bạn nên chọn sử dụng chúng giải pháp lưu trữ (Atlas). Tài liệu của họ làm cho có vẻ như có một tùy chọn đồng bộ hóa có thể.

Bài viết này từ tháng 12 năm 2018 thảo luận về việc sử dụng React Native, Stitch và MongoDB trong một ứng dụng mẫu, với các mẫu khác được liên kết trong tài liệu ( https://www.mongodb.com/blog/post/building-ios-and-android-apps -with-the-mongodb-Stitch-Reac -igen-sdk ).

Đồng bộ hóa Twilio

Một tùy chọn khác để đồng bộ hóa là Đồng bộ hóa của Twilio. Từ trang web của họ: "Đồng bộ hóa cho phép bạn quản lý trạng thái trên bất kỳ số lượng thiết bị nào theo thời gian thực mà không phải xử lý bất kỳ cơ sở hạ tầng phụ trợ nào."

Tôi đã xem đây là một giải pháp thay thế cho Firebase cho một trong những dự án đã nói ở trên, đặc biệt là sau khi nói chuyện với cả hai đội. Tôi cũng thích các công cụ liên lạc khác của họ và đã sử dụng chúng để nhắn tin cập nhật từ một ứng dụng web đơn giản.


[Chỉnh sửa] Tôi đã dành một chút thời gian với Realm kể từ khi tôi viết bài này. Tôi thích cách tôi không phải viết API để đồng bộ hóa dữ liệu giữa ứng dụng và máy chủ, tương tự như Firebase. Các chức năng không có máy chủ cũng có vẻ rất hữu ích với hai chức năng này, hạn chế số lượng mã phụ trợ tôi phải viết.

Tôi yêu sự linh hoạt của kho dữ liệu MongoDB, vì vậy đó đang trở thành lựa chọn của tôi cho phía máy chủ của các ứng dụng dựa trên web và các ứng dụng cần kết nối khác.

Tôi đã tìm thấy RESTHeart , nó tạo ra một API RESTful rất đơn giản, có thể mở rộng cho MongoDB. Không quá khó để xây dựng một thành phần React (Bản địa) để đọc và ghi các đối tượng JSON vào RESTHeart, từ đó chuyển chúng đến / từ MongoDB.


[Chỉnh sửa] Tôi đã thêm thông tin về cách lưu trữ dữ liệu. Đôi khi, điều quan trọng là phải biết bạn có thể làm được bao nhiêu công việc trong quá trình phát triển và thử nghiệm nếu bạn phải điều chỉnh và kiểm tra dữ liệu.


Chỉnh sửa 2/2019 Tôi đã thử nghiệm một vài trong số các tùy chọn này khi thiết kế một dự án đồng thời cao trong năm qua (2018). Một số trong số họ đề cập đến các giới hạn đồng thời cứng và mềm trong tài liệu của họ (Firebase có một kết nối cứng với 10.000 kết nối, tôi tin, trong khi Twilio là giới hạn mềm có thể bị phá vỡ, theo các cuộc thảo luận với cả hai nhóm tại AltConf).

Nếu bạn đang thiết kế một ứng dụng cho hàng chục đến hàng trăm nghìn người dùng, hãy chuẩn bị để mở rộng quy mô phụ trợ dữ liệu cho phù hợp.


1
Còn Redux thì sao?
HIRA THAKUR

4
@LeonardoDaCodinchi Redux sẽ hữu ích cho quản lý nhà nước nhưng không cung cấp chức năng lưu trữ liên tục.
walshie4

1
Tại sao không liên tục trong danh sách của bạn? bạn có thể vui lòng thêm một cái gì đó về nó? nếu nó là xấu
Shahzad Mirza

Khi tôi viết bài này, tôi đã không dành thời gian để xem bất cứ điều gì liên quan đến Redux. Các ứng dụng React và React-Native hiện tại của tôi (đã gần hai năm tuổi và chỉ ở chế độ bảo trì) không sử dụng nó. Có lẽ trong một dự án trong tương lai, nó sẽ xuất hiện, tại thời điểm đó tôi có thể đưa ra một số bình luận công bằng.
Bryan Scott

1
Tôi yêu cách bạn đưa lên tất cả mọi thứ. Sẽ tốt hơn nếu bạn thêm ưu và nhược điểm cho từng người trong số họ (cũng là liên kết của tài liệu đó). Giống như tôi đã tìm ra một AsyncStoragethứ chỉ hỗ trợ 6 MB trong Android trong khi đối với iOS thì không có giới hạn nào như vậy.
Jimit Patel

58

Nhanh chóng và bẩn: chỉ cần sử dụng Redux + phản ứng-Redux + Redux-tồn + AsyncStorage cho phản ứng bản địa.

Nó phù hợp gần như hoàn hảo với thế giới bản địa phản ứng và hoạt động như một nét quyến rũ cho cả Android và ios. Ngoài ra, có một cộng đồng vững chắc xung quanh nó, và rất nhiều thông tin.

Để biết ví dụ hoạt động, hãy xem F8App từ Facebook.

Các tùy chọn khác nhau cho sự kiên trì dữ liệu là gì?

Với phản ứng tự nhiên, có lẽ bạn muốn sử dụng redux và redux-contin. Nó có thể sử dụng nhiều công cụ lưu trữ. AsyncStorage và redux-contin-filesystem-Storage là các tùy chọn cho RN.

Có các tùy chọn khác như Firebase hoặc Realm, nhưng tôi không bao giờ sử dụng chúng trong dự án RN.

Đối với mỗi, các giới hạn của sự kiên trì đó là gì (nghĩa là khi nào dữ liệu không còn nữa)? Ví dụ: khi đóng ứng dụng, khởi động lại điện thoại, v.v.

Sử dụng redux + redux-contin bạn có thể xác định cái gì tồn tại và cái gì không. Khi không tồn tại, dữ liệu tồn tại trong khi ứng dụng đang chạy. Khi được duy trì, dữ liệu vẫn tồn tại giữa các lần thực thi ứng dụng (đóng, mở, khởi động lại điện thoại, v.v.).

AsyncStorage có giới hạn mặc định là 6MB trên Android. Có thể định cấu hình giới hạn lớn hơn (trên mã Java) hoặc sử dụng redux-contin-filesystem-Storage làm công cụ lưu trữ cho Android.

Đối với mỗi loại, có sự khác biệt (ngoài thiết lập chung) giữa việc triển khai trong iOS và Android không?

Sử dụng redux + redux-contin + AsyncStorage, thiết lập hoàn toàn giống nhau trên Android và iOS.

Làm thế nào để các tùy chọn so sánh để truy cập dữ liệu ngoại tuyến? (hoặc cách truy cập ngoại tuyến thường được xử lý?)

Sử dụng redux, truy cập offiline gần như tự động nhờ các bộ phận thiết kế của nó (người tạo hành động và bộ giảm tốc).

Tất cả dữ liệu bạn đã tìm nạp và lưu trữ đều khả dụng, bạn có thể dễ dàng lưu trữ dữ liệu bổ sung để chỉ ra trạng thái (tìm nạp, thành công, lỗi) và thời gian được tìm nạp. Thông thường, yêu cầu tìm nạp không làm mất hiệu lực dữ liệu cũ và các thành phần của bạn chỉ cập nhật khi nhận được dữ liệu mới.

Áp dụng tương tự theo hướng khác. Bạn có thể lưu trữ dữ liệu bạn đang gửi đến máy chủ và vẫn đang chờ xử lý và xử lý dữ liệu phù hợp.

Có bất kỳ cân nhắc nào khác tôi nên ghi nhớ?

React thúc đẩy cách tạo ứng dụng phản ứng và Redux rất phù hợp với nó. Bạn nên thử nó trước khi chỉ sử dụng một tùy chọn bạn sẽ sử dụng trong ứng dụng Android hoặc iOS thông thường. Ngoài ra, bạn sẽ tìm thấy nhiều tài liệu và trợ giúp cho những người đó.


3
Cảm ơn bạn đã tìm hiểu sâu về AsyncStorage / Redux Persist. Tôi đã tìm kiếm nhiều hơn về tổng quan của tất cả các tùy chọn, vì vậy đó là lý do duy nhất tôi không chọn đây là câu trả lời chính thức.
Sia

9

Mọi người ở trên nhấn đúng lưu ý để lưu trữ, mặc dù nếu bạn cũng cần xem xét bất kỳ dữ liệu PII nào cần lưu trữ thì bạn cũng có thể nhét vào móc khóa bằng cách sử dụng một cái gì đó như https://github.com/oblador/react-native-keychain vì ASyncStorage không được mã hóa. Nó có thể được áp dụng như là một phần của cấu hình bền vững trong một cái gì đó như redux-contin.


1

bạn có thể sử dụng bộ nhớ đồng bộ dễ sử dụng hơn bộ lưu trữ không đồng bộ. thư viện này rất tuyệt khi sử dụng bộ lưu trữ không đồng bộ để lưu dữ liệu không đồng bộ và sử dụng bộ nhớ để tải và lưu dữ liệu ngay lập tức, vì vậy chúng tôi lưu dữ liệu không đồng bộ vào bộ nhớ và sử dụng trong đồng bộ hóa ứng dụng, vì vậy điều này thật tuyệt.

import SyncStorage from 'sync-storage';

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

1

bạn có thể sử dụng Realm hoặc Sqlite nếu bạn muốn quản lý loại dữ liệu phức tạp.

Nếu không, đi với inbuilt phản ứng asynst Storage


0

Chúng ta không cần redux-kiên trì, chúng ta chỉ cần sử dụng redux để duy trì.

Reac-redux + AsyncStorage = redux-contin

Vì vậy, bên trong tập tin createdotre chỉ cần thêm các dòng này

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

điều này sẽ cập nhật AsyncStorage bất cứ khi nào có một số thay đổi trong cửa hàng redux.

Sau đó tải cửa hàng chuyển đổi json. khi tải ứng dụng. và thiết lập lại cửa hàng.

Bởi vì redux-contin tạo ra các vấn đề khi sử dụng wix Reac -igen-navigation. Nếu đó là trường hợp thì tôi thích sử dụng redux đơn giản với chức năng thuê bao ở trên

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.