这是我在确定一些当前应用程序项目的最佳方法时所学到的。
异步存储(React Native的“内置”)
我将AsyncStorage用于生产应用程序。存储位于设备本地,未加密(如另一个答案中所述),如果删除应用程序则消失,但应作为设备备份的一部分保存并在升级期间保持不变(包括本机升级ala TestFlight和通过CodePush进行的代码升级) )。
结论:本地存储;您提供自己的同步/备份解决方案。
SQLite的
我从事的其他项目使用sqlite3进行应用程序存储。这为您提供了类似SQL的体验,并且还具有可压缩的数据库,这些数据库也可以与设备之间进行传输。我没有将它们同步到后端的任何经验,但是我认为存在各种库。有用于连接到SQLite的RN库。
数据以传统的数据库格式存储,数据库,表,键,索引等均以二进制格式保存到磁盘。可通过命令行或具有SQLite驱动程序的应用程序直接访问数据。
结论:本地存储;您提供同步和备份。
火力基地
除了其他功能外,Firebase还提供了实时noSQL数据库以及JSON文档存储(例如MongoDB),用于保持1到n个客户端的同步。该文档讨论脱机持久性,但仅适用于本机代码(Swift / Obj-C,Java)。React Native使用的Google自己的JavaScript选项(“ Web”)不提供缓存的存储选项(请参见下面的2/18更新)。该库是在假定将要连接网络浏览器的情况下编写的,因此将存在半永久连接。您可能会编写一种本地缓存机制来补充Firebase存储调用,或者您可以在本机库和React Native之间编写一座桥梁。
自 2018年2月2日更新以来,我已经找到了 React Native Firebase,它为本地iOS和Android库提供了兼容的JavaScript接口(做了Google可能/应该做的事情),为您提供了本地库的所有好处以及React的好处本机支持。随着Google在实时数据库旁边引入JSON文档存储,我为Firebase提供了我计划构建的某些实时应用的良好外观。
实时数据库存储为类似JSON的树,您可以在网站上进行编辑并非常简单地导入/导出。
结论:通过react-native-firebase,RN获得了与Swift和Java相同的收益。[/ update]适用于网络连接的设备。成本低,利用率低。与其他Google云产品完美结合。数据可从其界面轻松查看和编辑。
领域
更新4/2020
MongoDB已收购Realm,并计划将其与MongoDB Stitch结合使用(如下所述)。这看起来非常令人兴奋。
也是具有自动网络同步的实时对象存储。他们自称为“设备优先”,演示视频展示了设备如何处理偶发性或有损的网络连接。
它们提供了免费版本的对象库,您可以在自己的服务器上或在AWS或Azure等云解决方案中托管。您还可以创建不与设备保持一致的内存中存储,不与服务器同步的仅设备存储,只读服务器存储以及用于在一台或多台设备上进行同步的完全读写选项。他们拥有专业和企业选择,每月费用比Firebase高。
与Firebase不同,React Native和Xamarin支持所有Realm功能,就像Swift / ObjC / Java(本机)应用程序一样。
您的数据绑定到代码中的对象。因为它们是定义的对象,所以您确实具有模式,并且版本控制对于代码的完整性是必须的。通过Realm提供的GUI工具可以直接访问。设备上的数据文件是跨平台兼容的。
结论:设备优先,与免费和付费计划的可选同步。React Native支持所有功能。水平缩放比Firebase昂贵。
iCloud的
老实说,我并没有做太多的事情,但是在不久的将来会做的。
如果您有使用CloudKit的本机应用程序,则可以使用CloudKit JS从Web应用程序(或本例中为React Native)连接到应用程序的容器。在这种情况下,您可能会有一个本地iOS应用程序和一个React Native Android应用程序。
与Realm一样,它会在本地存储数据,并在可能时将其同步到iCloud。您的应用有公共商店,每个客户都有私人商店。客户甚至可以选择与其他用户共享他们的一些商店或对象。
我不知道访问原始数据有多容易。可以在Apple网站上设置架构。
结论:非常适合以Apple为目标的应用程序。
Couchbase
大名鼎鼎,背后有许多大公司。有包含标准支持费用的社区版和企业版。
他们在他们的网站上有一个教程,将内容与React Native挂钩。我也没有花太多时间在此方面,但是就功能而言,它似乎是Realm的可行替代方案。我不知道在您的应用程序或所构建的任何API之外获取数据有多么容易。
[编辑:找到了一个较旧的链接,其中谈到了Couchbase和CouchDB,CouchDB可能是另一个可以考虑的选择。两者在历史上相关,但目前完全不同。查看此比较。]
结论:看起来具有与Realm类似的功能。可以是仅设备或同步的。我需要尝试一下。
MongoDB
更新4/2020
Mongo收购了Realm,并计划将MongoDB Stitch(下面讨论)与Realm(上面讨论)结合起来。
我正在将此服务器端用于在本地使用AsyncStorage的一部分应用程序。我喜欢所有内容都存储为JSON对象,从而使传输到客户端设备非常简单。在我的用例中,它用作上游电视指南数据提供者和客户端设备之间的缓存。
数据没有像架构这样的硬结构,因此每个对象都存储为易于搜索,可过滤等的“文档”。类似的JSON对象可以具有其他(但不同)属性或子对象,从而可以在构造对象/数据方面具有很大的灵活性。
我没有尝试过任何客户端到服务器的同步功能,也没有使用它嵌入。MongoDB的React Native代码确实存在。
结论:仅本地的NoSQL解决方案,没有像Realm或Firebase这样明显的同步选项。
更新2/2019
MongoDB有一个名为Stitch的“产品”(或服务)。由于客户端(在Web浏览器和电话的意义上)不应直接与MongoDB对话(由服务器上的代码完成),因此,如果您选择使用客户端,则他们创建了一个无服务器前端,您的应用程序可以与之交互托管解决方案(Atlas)。他们的文档显示似乎存在一个可能的同步选项。
2018年12月的这篇文章讨论了在示例应用程序中使用React Native,Stitch和MongoDB以及文档中链接的其他示例(https://www.mongodb.com/blog/post/building-ios-and-android-apps -与mongodb针迹反应本机SDK)。
Twilio同步
另一个NoSQL同步选项是Twilio的Sync。在他们的站点上:“通过同步,您可以大规模地实时管理任何数量的设备上的状态,而无需处理任何后端基础结构。”
我将其视为上述项目之一的Firebase替代品,尤其是在与两个团队交谈之后。我也喜欢他们的其他通讯工具,并使用它们来通过简单的Web应用程序发送短信更新。
[编辑]自从我最初撰写此书以来,我已经在Realm度过了一段时间。我喜欢不需要编写API来在应用程序和服务器之间同步数据的方式,类似于Firebase。无服务器功能对于这两个功能也确实很有帮助,从而限制了我必须编写的后端代码的数量。
我喜欢MongoDB数据存储的灵活性,因此这成为基于Web的应用程序和其他需要连接的应用程序的服务器端的我的选择。
我找到了RESTHeart,它为MongoDB创建了一个非常简单,可扩展的RESTful API。构建一个React(Native)组件来读写JSON对象到RESTHeart,然后再将它们传递到MongoDB并不难。
[编辑]我添加了有关如何存储数据的信息。有时,必须进行调整和测试数据,了解在开发和测试期间可能需要进行多少工作,这一点很重要。
编辑2/2019在过去的一年(2018)设计高并发项目时,我尝试了其中几种选项。其中一些人在其文档中提到了硬性和软性并发限制(根据与AltConf两家团队的讨论,我相信Firebase在10,000个连接时有一个硬性限制,而Twilio的限制可能会被打破)。
如果要为成千上万的用户设计应用程序,请准备相应地扩展数据后端。