What are my options for storing data when using React Native? (iOS and Android)
我在React本地世界和移动/本地世界都是新手,在数据持久性方面,我发现文档有点欠缺。
我在react native中存储数据的选项有哪些,以及每种类型的含义?例如,我看到有本地存储和异步存储,但是我也看到了领域之类的东西,我很困惑这一切如何与外部数据库一起工作。
我特别想知道:
- 数据持久性有哪些不同的选项?
- 对于每种情况,持久性的限制是什么(即数据何时不再可用)?例如:关闭应用程序、重新启动电话等。
- 对于每一种,在iOS和Android中实现之间是否存在差异(除了一般设置)?
- 如何比较离线访问数据的选项?(或者脱机访问通常是如何处理的?)
- 还有什么需要考虑的吗?
谢谢你的帮助!
以下是我在确定推进几个当前应用程序项目的最佳方法时学到的知识。好的。
异步存储("内置"以响应本机)好的。
我在生产应用程序中使用异步存储。存储保持在设备本地,未加密(如另一个答案中所述),如果删除应用程序则会消失,但应作为设备备份的一部分保存,并在升级过程中保持不变(本地升级ala testfirght和通过codepush进行的代码升级)。好的。
结论:本地存储;您提供自己的同步/备份解决方案。好的。
数据库好的。
我从事的其他项目使用了sqlite3作为应用程序存储。这为您提供了一种类似SQL的体验,可压缩的数据库也可以在设备之间传输。我没有将它们同步到后端的经验,但我认为存在各种库。有RN库用于连接到sqlite。好的。
数据以传统的数据库格式存储,数据库、表、键、索引等都以二进制格式保存到磁盘上。可以通过命令行或具有sqlite驱动程序的应用程序直接访问数据。好的。
结论:本地存储;您提供同步和备份。好的。
火力基地好的。
FireBase提供了一个实时的NoSQL数据库和一个JSON文档存储(比如MongoDB),用于保持1到n个客户机的同步。文档讨论脱机持久性,但只对本机代码(SWIFT、Java、Java)进行讨论。React Native使用的Google自己的javascript选项("web")不提供缓存存储选项(请参阅下面的2/18更新)。这个库是以Web浏览器将要连接的假设编写的,因此将有一个半持久的连接。您可以编写本地缓存机制来补充FireBase存储调用,也可以编写本机库和react native之间的桥梁。好的。
[更新2/2018]之后,我发现了React Native FireBase,它为本机iOS和Android库提供了兼容的javascript接口(做谷歌可能/应该做的),为您提供了本机库的所有优点和React Native的支持。随着谷歌在实时数据库旁边引入了一个JSON文档库,我将再次为FireBase寻找一些我计划构建的实时应用程序。好的。
实时数据库以类似JSON的树的形式存储,您可以在网站上编辑并简单地导入/导出。好的。
结论:与本地FixBASE反应,RN得到与SWIFT和Java相同的好处。[/update]对网络连接的设备缩放良好。低利用成本低。与其他谷歌云产品完美结合。数据在界面上容易看到和编辑。好的。
境界好的。
也是一个实时对象存储与automagic网络同步。他们把自己吹捧为"设备第一",演示视频展示了这些设备如何处理零星或有损的网络连接。好的。
它们提供了一个免费的对象存储版本,您可以在自己的服务器上或在云解决方案(如AWS或Azure)中托管它。您还可以创建不与设备保持一致的内存中存储、不与服务器同步的设备专用存储、只读服务器存储以及用于跨一个或多个设备同步的完整读写选项。他们有专业和企业的选择,每月比FireBase的前期成本更高。好的。
与FielBASE不同,所有的领域能力都支持NeXT和XAMARIN,就像SWIFT/Objc/Java(原生)应用程序一样。好的。
您的数据绑定到代码中的对象。因为它们是已定义的对象,所以您确实有一个模式,并且版本控制对于代码健全性来说是必须的。直接访问通过GUI工具领域提供。设备上的数据文件是跨平台兼容的。好的。
结论:设备优先,可选择与免费和付费计划同步。React Native中支持的所有功能。水平缩放比FireBase更昂贵。好的。
苹果云好的。
老实说,我在这方面做得不多,但在不久的将来会这样做。好的。
如果您有一个使用CloudKit的本机应用程序,您可以使用CloudKit JS从Web应用程序(或者在我们的例子中,React Native)连接到您的应用程序的容器。在这种情况下,您可能会有一个原生iOS应用程序和一个反应原生Android应用程序。好的。
与领域类似,它在本地存储数据,并在可能时将其同步到iCloud。你的应用程序有公共商店,每个客户有私人商店。客户甚至可以选择与其他用户共享他们的一些商店或对象。好的。
我不知道访问原始数据有多容易;模式可以在苹果的网站上设置。好的。
结论:非常适合针对苹果的应用程序。好的。
沙发底座好的。
大名鼎鼎,背后有很多大公司。有一个带有标准支持成本的社区版和企业版。好的。
他们在自己的网站上提供了一个教程,用于将事物连接起来以响应本机。我在这方面也没有花太多时间,但在功能方面,它似乎是领域的一个可行的替代方案。我不知道在你的应用程序或任何你构建的API之外访问你的数据有多容易。好的。
[编辑:找到一个旧的链接,谈论Couchbase和CouCHDB,而CouCHDB可能是另一个可以考虑的选项。这两种产品有着历史渊源,但目前完全不同。请参阅此比较。]好的。
结论:看起来和领域有相似的能力。只能是设备或同步。我要试试看。好的。
蒙哥大好的。
我在使用这个服务器端作为本地使用异步存储的应用程序的一部分。我喜欢将所有内容都存储为JSON对象,使到客户机设备的传输非常简单。在我的用例中,它被用作上游电视指南数据提供商和我的客户端设备之间的缓存。好的。
数据没有硬结构,比如模式,所以每个对象都存储为一个易于搜索、可过滤等的"文档"。类似的JSON对象可以具有附加(但不同)属性或子对象,从而在如何构造对象/数据方面具有很大的灵活性。好的。
我没有尝试过任何客户端到服务器的同步功能,也没有使用嵌入的功能。MongoDB的react本机代码确实存在。好的。
结论:本地仅NoSQL解决方案,没有明显的同步选项,如realm或firebase。好的。
[更新2/2019 ]好的。
MongoDB有一个名为Stitch的"产品"(或服务)。由于客户机(从Web浏览器和电话的意义上讲)不应该直接与MongoDB通信(这是通过服务器上的代码实现的),因此,如果您选择使用他们的托管解决方案(Atlas),他们创建了一个无服务器前端,您的应用程序可以与之交互。他们的文档显示可能存在同步选项。好的。
这篇从2018年12月开始的文章讨论了在示例应用程序中使用react native、stitch和mongodb,文档中链接了其他示例(https://www.mongodb.com/blog/post/building ios和android应用程序与mongodb stitch react native sdk)。好的。
双同步好的。
同步的另一个NoSQL选项是Twilio的同步。从他们的网站:"通过同步,您可以跨任意数量的设备实时大规模地管理状态,而无需处理任何后端基础设施。"好的。
我认为这是上述项目之一的FireBase的替代方案,特别是在与两个团队交谈之后。我也喜欢他们的其他通信工具,并使用它们从一个简单的Web应用程序发送更新信息。好的。
[更新]好的。
[编辑]自从我最初写这篇文章以来,我在领域花了一些时间。我喜欢我不必编写API来同步应用程序和服务器之间的数据,类似于FireBase。无服务器函数在这两个方面也非常有用,限制了我必须编写的后端代码的数量。好的。
我喜欢MongoDB数据存储的灵活性,因此这正成为我在基于Web和其他需要连接的应用程序的服务器端的选择。好的。
我找到了restheart,它为MongoDB创建了一个非常简单、可扩展的restful API。构建一个读写JSON对象到restheart的react(本机)组件不应该太难,后者反过来将它们传递给/来自mongodb。好的。
[编辑]我添加了有关如何存储数据的信息。有时,如果您需要调整和测试数据,那么了解在开发和测试期间您可能需要做多少工作是很重要的。好的。
[更新2/2019]我在过去一年(2018年)设计一个高并发性项目时尝试了其中几个选项。他们中的一些人在他们的文档中提到了硬并发和软并发限制(根据Altconf与两个团队的讨论,我认为FireBase在10000个连接上有一个硬并发限制,而Twilio是一个软并发限制,可能会被取消)。好的。
如果您正在为数万到数十万用户设计一个应用程序,请准备相应地扩展数据后端。好的。好啊。
快速和肮脏:只需使用redux+react redux+redux persist+asyncstorage作为react native。
它几乎完全符合反作用的本地世界,对Android和iOS都是一种魅力。此外,它周围还有一个坚实的社区,以及大量的信息。
有关工作示例,请参见Facebook的f8app。
What are the different options for data persistence?
使用react native,您可能希望使用redux和redux persist。它可以使用多个存储引擎。异步存储和redux持久文件系统存储是RN的选项。
还有其他的选择,如FireBase或Realm,但我从未在RN项目中使用过它们。
For each, what are the limits of that persistence (i.e., when is the data no longer available)? For example: when closing the application, restarting the phone, etc.
使用redux+redux persist,可以定义什么是持久的,什么不是持久的。如果不持久,则数据在应用程序运行时存在。当持续存在时,数据在应用程序执行之间持续存在(关闭、打开、重新启动电话等)。
在Android上,异步存储的默认限制为6MB。可以配置更大的限制(Java代码)或使用ReDuxAc持久文件系统存储作为Android的存储引擎。
For each, are there differences (other than general setup) between implementing in iOS vs Android?
使用Redux+Redux Persist+AsyncStorage,安卓和iOS上的设置完全相同。
How do the options compare for accessing data offline? (or how is offline access typically handled?)
使用Redux,由于其设计部分(动作创建者和Reducers),离线访问几乎是自动的。
您提取和存储的所有数据都是可用的,您可以轻松地存储额外的数据,以指示状态(提取、成功、错误)和提取时间。通常,请求获取不会使旧数据失效,而您的组件只会在收到新数据时更新。
另一个方向也同样适用。您可以存储发送到服务器的数据,这些数据仍处于挂起状态,并进行相应的处理。
Are there any other considerations I should keep in mind?
React促进了创建应用程序的反应式方式,Redux非常适合它。在使用常规Android或iOS应用程序中使用的选项之前,您应该先尝试一下。此外,您还可以找到更多的文档和帮助。
上面的人选择了正确的存储注释,但是如果您还需要考虑需要存储的任何PII数据,那么您也可以使用https://github.com/obaldor/react-native-keychain之类的东西来存储到密钥链中,因为异步存储是未加密的。它可以作为持久配置的一部分应用于ReduxPersist之类的内容。
您可以使用比异步存储更容易使用的同步存储。这个库非常棒,它使用异步存储异步保存数据,并使用内存立即同步加载和保存数据,所以我们将数据异步保存到内存中并在应用程序同步中使用,所以这非常棒。
1 2 3 4 5 | import SyncStorage from 'sync-storage'; SyncStorage.set('foo', 'bar'); const result = SyncStorage.get('foo'); console.log(result); // 'bar' |
我们不需要redux-persisten,我们可以简单地使用redux来实现持久性。
react redux+异步存储=redux持久
所以在createsotre文件中只需添加这些行
1 | store.subscribe(async()=> await AsyncStorage.setItem("store", JSON.stringify(store.getState()))) |
这将在Redux存储中发生更改时更新AsyncStorage。
然后加载JSON转换的存储。当应用程序加载时。重新开店。
因为redux在使用wix react本机导航时会产生问题。如果是这种情况,那么我更喜欢使用简单的redux和上面的用户函数