使用 React Native 时我都有哪些存储数据的选项? (iOS和Android)[关闭]

Posted

技术标签:

【中文标题】使用 React Native 时我都有哪些存储数据的选项? (iOS和Android)[关闭]【英文标题】:What are my options for storing data when using React Native? (iOS and Android) [closed]使用 React Native 时我有哪些存储数据的选项? (iOS和Android)[关闭] 【发布时间】:2017-11-06 15:26:58 【问题描述】:

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

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

我特别想知道:

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

感谢您的帮助!

【问题讨论】:

【参考方案1】:

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

异步存储(以前“内置”到 React Native,现在独立移动)

我将 AsyncStorage 用于生产中的应用程序。存储在设备本地,未加密(如另一个答案中所述),如果您删除应用程序会消失,但应保存为设备备份的一部分并在升级期间持续存在(本机升级 ala TestFlight 和通过 CodePush 进行的代码升级)。

结论:本地存储;您提供自己的同步/备份解决方案。

SQLite

我参与的其他项目使用 sqlite3 进行应用存储。这为您提供了类似 SQL 的体验,可压缩的数据库也可以在设备之间传输。我没有任何将它们同步到后端的经验,但我想存在各种库。有用于连接 SQLite 的 RN 库。

数据以传统的数据库格式存储,数据库、表、键、索引等都以二进制格式保存到磁盘。可以通过命令行或具有 SQLite 驱动程序的应用程序直接访问数据。

结论:本地存储;您提供同步和备份。

Firebase

Firebase 提供实时 noSQL 数据库以及 JSON 文档存储(如 MongoDB),用于保持 1 到 n 个客户端同步。文档讨论了离线持久性,但仅适用于本机代码(Swift/Obj-C、Java)。 React Native 使用的 Google 自己的 javascript 选项(“Web”)不提供缓存存储选项(请参阅下面的 2/18 更新)。该库是在假设 Web 浏览器将要连接的情况下编写的,因此会有一个半持久连接。您可能可以编写一个本地缓存机制来补充 Firebase 存储调用,或者您可以编写原生库和 React Native 之间的桥梁。

2018 年 2 月更新 从那以后,我找到了React Native Firebase,它为原生 iOS 和 Android 库提供了一个兼容的 JavaScript 接口(做 Google 可能/应该做的事情),为你提供原生库的所有好处和 React Native 支持。随着 Google 在实时数据库旁边引入 JSON 文档存储,我将重新审视 Firebase 以了解我计划构建的一些实时应用程序。

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

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

领域

2020 年 4 月更新 MongoDB 已经收购了 Realm,并计划将其与 MongoDB Stitch(下文讨论)结合起来。 This looks very exciting.

2020 年 9 月更新 使用过 Realm vs. 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 可能是另一个需要考虑的选项。两者是历史相关但目前完全不同的产品。见this comparison。]

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

MongoDB

2020 年 4 月更新

Mongo 收购了 Realm 和 plans to combine MongoDB Stitch(下面讨论)与 Realm(上面讨论过)。


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

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

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

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

2019 年 2 月更新

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。


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


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

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

【讨论】:

那么 Redux 呢? @LeonardoDaCodinchi Redux 将有助于状态管理,但不提供持久存储功能。 为什么不在你的列表中使用 redux-persistent?你能补充一下吗?如果有那么糟糕。 当我写这篇文章时,我没有花任何时间查看任何与 Redux 相关的东西。我现有的 React 和 React-Native 应用程序(现在差不多两年了,只处于维护模式)不使用它。也许在未来的项目中会出现,届时我可以提供一些公平的评论。 我喜欢你放置所有东西的方式。如果你为它们中的每一个添加优点和缺点会更好(也是它的文档的链接)。就像我为 AsyncStorage 找到的一样,它在 Android 中仅支持 6 MB,而对于 iOS 则没有这样的限制。【参考方案2】:

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

否则使用内置的 react native asynstorage

【讨论】:

【参考方案3】:

您可以使用sync storage,它比异步存储更易于使用。 这个库很棒,它使用异步存储来异步保存数据,并使用内存来立即同步加载和保存数据,所以我们将数据异步保存到内存并在应用程序同步中使用,所以这很棒。

import SyncStorage from 'sync-storage';

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

【讨论】:

【参考方案4】:

我们不需要 redux-persist,我们可以简单地使用 redux 进行持久化。

react-redux + AsyncStorage = redux-persist

所以在 createotre 文件中只需添加这些行

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

每当 redux 存储发生一些变化时,这将更新 AsyncStorage。

然后加载 json 转换的存储。当应用程序加载时。并重新设置商店。

因为 redux-persist 在使用 wix react-native-navigation 时会产生问题。如果是这样的话,那么我更喜欢使用带有上述订阅者功能的简单 redux

【讨论】:

这样做和使用 redux-persist 有什么区别吗?如果我放弃了 redux-persist,我会失去什么吗?【参考方案5】:

又快又脏:只使用 Redux + react-redux + redux-persist + AsyncStorage 来做 react-native。

它几乎完美地适应了 react native 世界,并且对 android 和 ios 都适用。此外,它周围有一个稳固的社区,并且有大量的信息。

有关工作示例,请参阅 Facebook 的 F8App。

数据持久性有哪些不同的选项?

使用 react native,你可能想要使用 redux 和 redux-persist。它可以使用多个存储引擎。 AsyncStorage 和 redux-persist-filesystem-storage 是 RN 的选项。

还有其他选项,例如 Firebase 或 Realm,但我从未在 RN 项目中使用过这些选项。

对于每一个,这种持久性的限制是什么(即数据何时不再可用)?例如:关闭应用、重启手机等时。

使用 redux + redux-persist 你可以定义什么是持久化的,什么不是。如果不持久化,则数据在应用程序运行时存在。持久化后,数据会在应用执行(关闭、打开、重启手机等)之间持久化。

AsyncStorage 在 Android 上的默认限制为 6MB。可以配置更大的限制(在 Java 代码上)或使用 redux-persist-filesystem-storage 作为 Android 的存储引擎。

对于每一个,在 iOS 和 Android 中实现之间是否存在差异(一般设置除外)?

使用 redux + redux-persist + AsyncStorage 设置在 android 和 iOS 上完全相同。

如何比较离线访问数据的选项? (或者离线访问通常是如何处理的?)

使用 redux,离线访问几乎是自动的,这要归功于它的设计部分(动作创建器和减速器)。

您获取和存储的所有数据都可用,您可以轻松存储额外数据以指示状态(获取、成功、错误)和获取时间。通常,请求提取不会使旧数据失效,并且您的组件只会在收到新数据时更新。

同样适用于另一个方向。您可以存储要发送到服务器但仍处于待处理状态的数据并进行相应处理。

还有其他需要注意的事项吗?

React 提倡一种创建应用程序的响应式方式,而 Redux 非常适合它。您应该在使用常规 Android 或 iOS 应用程序中使用的选项之前尝试一下。此外,您会发现更多文档和相关帮助。

【讨论】:

感谢您深入了解 AsyncStorage/Redux Persist。我正在寻找更多关于所有选项的概述,所以这是我没有选择这个作为官方答案的唯一原因。 此解决方案效果很好,但如果您进入这个兔子洞,请注意 Android 设备上的 AsyncStorage 6MB 限制! standardco.de/…. 我正在这样做,我正在考虑的主要考虑是如何备份这个 redux 持久化的本地数据,以便如果用户删除应用程序并重新安装,或者更改他们的手机数据是重装后还在吗?【参考方案6】:

上面的人对存储提出了正确的要求,但如果您还需要考虑任何需要存储的 PII 数据,那么您也可以使用 https://github.com/oblador/react-native-keychain 之类的东西存储到钥匙串中,因为 ASyncStorage 是未加密的。它可以作为持久配置的一部分应用在 redux-persist 中。

【讨论】:

以上是关于使用 React Native 时我都有哪些存储数据的选项? (iOS和Android)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

离线时发布(React-Native)

react native开发的应用都有哪些更新应用解决方案?

AXIOS 调用在 React-Native 0.63 中给出网络错误

对于浏览器中的可索引本地存储,我都有哪些选择?

React Native 为啥每次点击 textInput 时我的键盘都会立即消失?

Android 10:我都有哪些选择可以将外部存储上的文件保存到名为“/sdcard/my-app/”的目录中