使用 React Native 时,我有哪些存储数据的选项? (iOS 和安卓)

新手上路,请多包涵

我还是 React Native 世界的新手,通常在移动/原生世界也是如此,我发现文档在数据持久性方面有点缺乏。

我在 React Native 中存储数据有哪些选择以及每种类型的含义?例如,我看到有本地存储和异步存储,但我也看到了 Realm 之类的东西,我很困惑所有这些如何与外部数据库一起工作。

我特别想知道:

  • 数据持久性有哪些不同的选项?
  • 对于每一个,这种持久性的限制是什么(即数据何时不再可用)?例如:关闭应用程序、重启手机等时。
  • 对于每一个,在 iOS 和 Android 中实现之间是否存在差异(除了一般设置)?
  • 如何比较离线访问数据的选项? (或者通常如何处理离线访问?)
  • 我还应该记住其他任何注意事项吗?

谢谢你的帮助!

原文由 Sia 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 913
2 个回答

这是我在确定推进我当前的几个应用程序项目的最佳方式时所学到的。

异步存储(以前“内置”到 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”)不提供缓存存储选项(请参阅下面的 218 更新)。该库是在假设 Web 浏览器将要连接的情况下编写的,因此会有一个半持久连接。您可能可以编写一个本地缓存机制来补充 Firebase 存储调用,或者您可以编写原生库和 React Native 之间的桥梁。

更新 22018 此后 我发现 React Native Firebase 为原生 iOS 和 Android 库提供了兼容的 JavaScript 接口(做谷歌可能/应该做的事情),为你提供原生库的所有好处和 React 的奖励原生支持。随着 Google 在实时数据库旁边引入 JSON 文档存储,我对 Firebase 重新审视了我计划构建的一些实时应用程序。

实时数据库存储为类似 JSON 的树,您可以在网站上对其进行编辑并非常简单地导入/导出。

结论:使用 react-native-firebase,RN 可以获得与 Swift 和 Java 相同的好处。 [/update] 适用于联网设备。低利用率成本低。与其他 Google 云产品完美结合。数据从他们的界面很容易看到和编辑。

领域

2020 年 4 月更新 MongoDB 已收购 Realm,并计划将其与 MongoDB Stitch(下文讨论)结合起来。 这看起来很令人兴奋

更新 92020 使用过 Realm 与 Stitch:Stitch API 本质上允许 JS 应用程序(React Native 或 Web)直接与 Mongo 数据库对话,而不是通过您自己构建的 API 服务器。

Realm 旨在在进行更改时同步数据库的某些部分。

两者的结合有点令人困惑。以前的 Stitch API 仍然像传统的 Mongo 查询和更新调用一样工作,而较新的 Realm 东西附加到代码中的对象并自行处理同步……主要是。我仍在使用 SwiftUI 的一个项目中通过正确的方式做事,所以这有点离题。但仍然很有希望和整洁。


也是具有自动网络同步功能的实时对象存储。他们吹嘘自己是“设备优先”,演示视频展示了设备如何处理零星或有损的网络连接。

他们提供免费版本的对象存储,您可以将其托管在自己的服务器或 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 为目标的应用程序。

沙发底座

大牌,背后有很多大公司。有标准支持费用的社区版和企业版。

他们在他们的网站上有一个教程,用于将东西连接到 React Native。我也没有花太多时间在这个上,但就功能而言,它看起来是 Realm 的可行替代方案。我不知道在您的应用程序或您构建的任何 API 之外获取您的数据是多么容易。

[编辑:找到一个关于 Couchbase 和 CouchDB 的旧链接,CouchDB 可能是另一个需要考虑的选项。两者是历史相关但目前完全不同的产品。请参阅 此比较。]

结论:看起来与 Realm 具有相似的功能。可以是仅限设备或同步的。我需要尝试一下。

MongoDB

2020 年 4 月更新

Mongo 收购了 Realm,并 计划将 MongoDB Stitch (下文讨论)与 Realm(上文讨论)结合起来。


我将此服务器端用于在本地使用 AsyncStorage 的应用程序。我喜欢将所有内容都存储为 JSON 对象,这使得向客户端设备的传输非常简单。在我的用例中,它用作电视指南数据的上游提供商和我的客户端设备之间的缓存。

数据没有硬结构,如模式,因此每个对象都存储为易于搜索、过滤等的“文档”。类似的 JSON 对象可能具有其他(但不同)属性或子对象,允许在如何构建对象/数据方面具有很大的灵活性。

我没有尝试任何客户端到服务器的同步功能,也没有使用它嵌入。 MongoDB 的 React Native 代码确实存在。

结论:仅限本地 NoSQL 解决方案,没有像 Realm 或 Firebase 这样的明显同步选项。

22019 更新

MongoDB 有一个名为 Stitch 的“产品”(或服务)。由于客户端(在 Web 浏览器和手机的意义上)不应该直接与 MongoDB 对话(这是通过您服务器上的代码完成的),他们创建了一个无服务器前端,您的应用程序可以与之交互,如果您选择使用他们的托管解决方案(Atlas)。他们的文档表明存在可能的同步选项。

这篇 2018 年 12 月的文章讨论了在示例应用程序中使用 React Native、Stitch 和 MongoDB,以及文档中链接的其他示例 ( https://www.mongodb.com/blog/post/building-ios-and-android-apps -with-the-mongodb-stitch-react-native-sdk )。

Twilio 同步

另一个用于同步的 NoSQL 选项是 Twilio 的 Sync。在他们的网站上:“同步让您可以大规模实时管理任意数量设备的状态,而无需处理任何后端基础设施。”

我将其视为上述项目之一的 Firebase 的替代方案,尤其是在与两个团队交谈之后。我也喜欢他们的其他通讯工具,并使用它们从一个简单的网络应用程序发送更新消息。


[编辑] 自从我最初写这篇文章以来,我已经在 Realm 上度过了一段时间。我喜欢我不必编写 API 来在应用程序和服务器之间同步数据,类似于 Firebase。无服务器函数看起来对这两个函数也很有帮助,限制了我必须编写的后端代码量。

我喜欢 MongoDB 数据存储的灵活性,因此它正在成为基于 Web 和其他需要连接的应用程序的服务器端的选择。

我找到 了 RESTHeart ,它为 MongoDB 创建了一个非常简单、可扩展的 RESTful API。构建一个读取 JSON 对象并将其写入 RESTHeart 的 React (Native) 组件应该不难,RESTHeart 反过来将它们传递给/从 MongoDB。


[编辑] 我添加了有关如何存储数据的信息。有时,如果您必须调整和测试数据,那么了解在开发和测试期间您可能会做多少工作是很重要的。


编辑 22019 在过去的一年(2018 年)设计高并发项目时,我尝试了其中的几个选项。他们中的一些人在他们的文档中提到了硬并发限制和软并发限制(根据在 AltConf 与两个团队的讨论,我相信 Firebase 的硬限制是 10,000 个连接,而 Twilio 的软限制是可以提高的)。

如果您正在为数万到数十万用户设计应用程序,请准备相应地扩展数据后端。

原文由 Bryan Scott 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果要管理复杂的数据类型,可以使用 Realm 或 Sqlite。

否则使用内置的 react native asynstorage

原文由 sreerag 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题