使用React Native时,我有什么select来存储数据? (iOS和Android)

在React Native世界中,我还是一个新手,通常也是在移动/本地世界,而且我发现在数据持久性方面文档有点欠缺。

我在React Native中存储数据的选项有哪些,以及每种types的含义? 例如,我看到有本地存储和asynchronous存储,但是我也看到了像Realm这样的东西,我很困惑这些东西如何与外部数据库一起工作。

我特别想知道:

  • 数据持久性有哪些不同的选项?
  • 对于每一个,持久性的限制是什么(即什么时候数据不再可用)? 例如:closures应用程序,重新启动电话等
  • 对于每一个,在iOS和Android实施之间是否有差异(除了一般设置)?
  • 如何比较离线访问数据的选项? (或离线访问通常如何处理?)
  • 还有其他的考虑我应该记住吗?

谢谢你的帮助!

Solutions Collecting From Web of "使用React Native时,我有什么select来存储数据? (iOS和Android)"

这是我所学到的,因为我确定了一些最新的应用程序项目。

asynchronous存储 (“内置”到React Native)

我使用AsyncStorage生产应用程序。 存储保持在设备本地,没有encryption(如另一个答案中提到的),如果删除应用程序,则会消失,但应该保存为设备备份的一部分,并在升级过程中保留(本机升级ala TestFlight和通过CodePush升级代码)。

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

SQLite的

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

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

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

火力地堡

Firebase是一个实时的noSQL数据库,旨在保持1-n个客户端的同步。 该文档讨论脱机持久性,但只适用于本机代码(Swift / Obj-C,Java)。 React Native使用的JavaScript选项(“Web”)不提供caching存储选项。 这个库的编写是假设一个Web浏览器将要连接,所以会有一个半持久连接。 您可能可以编写本地caching机制来补充Firebase存储调用,也可以在本机库和React Native之间编写桥接。

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

结论:networking优先,没有RNcaching。 适合networking连接的设备。 成本低,利用率低。 与其他Google云产品很好地结合在一起。 数据随时可见并可从其界面进行编辑。

领域

也是一个实时对象存储与自动networking同步。 他们吹捧自己为“设备第一”,演示video显示设备如何处理零星或有损networking连接。

他们提供您在自己的服务器上托pipe的对象存储的免费版本,或者在AWS或Azure等云解决scheme中提供的版本。 您还可以创build不会与设备持久存储的内存存储,仅与设备同步的仅设备存储,只读服务器存储以及用于跨一个或多个设备进行同步的完整读写选项。 他们拥有的专业和企业选项比Firebase每月的前期花费更多。

与Firebase不同,React Native和Xamarin支持所有Realmfunction,就像在Swift / ObjC / Java(native)应用程序中一样。

您的数据绑定到代码中的对象。 因为它们是被定义的对象,所以你有一个模式,并且版本控制是代码完整性的必须。 通过Realm提供的GUI工具可以直接访问。 设备上的数据文件是跨平台兼容的。

结论:设备第一,可选与免费和付费计划同步。 React Native支持所有function。 水平缩放比Firebase更昂贵。

iCloud的

我真的没有玩过这个游戏,但在不久的将来会这样做。

如果您有使用CloudKit的本机应用程序,则可以使用CloudKit JS从Web应用程序(或者在我们的示例中为React Native)连接到应用程序的容器。 在这种情况下,您可能会拥有本机iOS应用程序和React Native Android应用程序。

像Realm一样,这将数据存储在本地,并在可能的情况下将其同步到iCloud。 有为您的应用程序和每个客户的私人商店公共商店。 客户甚至可以select与其他用户共享一些商店或对象。

我不知道访问原始数据有多简单, 模式可以在苹果的网站上build立。

结论:非常适合以Apple为目标的应用程序。

Couchbase

大名,很多大公司背后。 有一个社区版和企业版的标准支持成本。

他们已经在他们的网站上有一个教程来把事情连接到React Native。 我也没有花太多时间在这个上,但它在function上看起来是Realm的一个可行的替代scheme。 我不知道在您的应用程序或您构build的任何API之外获取数据是多么容易。

[编辑:find一个关于Couchbase和CouchDB的旧链接,CouchDB可能是另一个select。 这两者在历史上是相关的,但目前完全不同的产品。 看这个比较 。]

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

MongoDB的

我正在使用这个服务器端的一部分在本地使用AsyncStorage的应用程序。 我喜欢所有东西都存储为JSON对象,使传输到客户端设备非常简单。 在我的使用案例中,它被用作电视指南数据的上游供应商和我的客户端设备之间的caching。

数据没有硬结构,就像一个模式,所以每个对象都被存储为一个容易被search,可过滤的“文档”。类似的JSON对象可以有额外的(但不同的)属性或子对象,允许在如何构build对象/数据方面有很大的灵活性。

我没有尝试任何客户端到服务器同步function,也没有使用它embedded式。 React本地代码MongoDB确实存在。

结论:本地唯一的NoSQL解决scheme,像Realm或Firebase没有明显的同步选项。


[编辑]自从我写这本书以来,我花了一些时间与领域。 我喜欢我不需要编写API来同步应用程序和服务器之间的数据,类似于Firebase。 无服务器function也看起来对这两个真正有帮助,限制了我必须写的后端代码的数量。

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

我发现了RESTHeart ,它为MongoDB创build了一个非常简单的,可扩展的RESTful API。 构build一个将JSON对象读写到RESTHeart的React(Native)组件应该不会太困难,而RESTHeart会依次将这些对象传递给MongoDB。


[编辑]我添加了有关数据如何存储的信息。 在开发和testing过程中,如果您需要调整和testing数据,有时候了解您可能需要做多less工作是非常重要的。

快速和肮脏:只需使用Redux + react-redux + redux-persist + AsyncStorage进行反应即可。

它几乎完全符合原生世界的反应,并且像android和ios的魅力一样工作。 另外,周围还有一个坚实的社区,还有大量的信息。

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

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

通过反应原生,你可能想要使用redux和redux-persist。 它可以使用多个存储引擎。 AsyncStorage和redux-persist-filesystem-storage是RN的选项。

还有其他选项,如Firebase或Realm,但是我从来没有在RN项目上使用过这些选项。

对于每一个,持久性的限制是什么(即什么时候数据不再可用)? 例如:closures应用程序,重新启动电话等

使用redux + redux-persist可以定义什么是持久的,哪些不是。 如果未保留,数据在应用程序运行时存在。 持久化后,数据在应用程序执行(closures,打开,重新启动电话等)之间持续存在。

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

对于每一个,在iOS和Android实施之间是否有差异(除了一般设置)?

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

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

使用redux,由于其devise部分(动作创build者和缩减器),offiline访问几乎是自动的。

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

这同样适用于另一个方向。 您可以存储您发送给服务器的数据,这些数据仍然处于待处理状态,并据此进行处理。

还有其他的考虑我应该记住吗?

React提供了创build应用程序的被动方式,而且Redux非常适合。 您只需使用您在常规Android或iOS应用程序中使用的选项即可试用。 另外,你会发现更多的文档和帮助。

上面的人打出正确的存储注释,但如果你还需要考虑任何需要存储的PII数据,那么你也可以使用像https://github.com/oblador/react-native-keychain因为ASyncStorage是未encryption的。 它可以作为持久化configuration的一部分应用于像redux-persist之类的东西。

我会发布我从其他人那里收集的,但是不会接受这个答案,因为我知道你们中的一些人会更好地解释这个。 另外,并不是所有的答案都可能是完全准确的,所以你可以在评论中让我知道,我会更新这个答案。

仅设备存储

选项:

  • AsyncStorage(Redux-Native in使用AsyncStorage,除非您指定自定义存储引擎)
  • 领域
  • Firebase(或者只有设备和外部?)

注意事项:

  • closures应用程序或重新启动设备后,数据仍然保存。
  • 只要从应用程序中删除应用程序,数据就会被删除(对于所有的选项,或者只是AsyncStorage和iOS?那么iCloud和Android的类似考虑呢?)

跨设备存储

这通常是通过外部数据库(和用户帐户)来完成的,并且设备持久化数据与外部数据库数据进行水合和同步。 (需要更好的信息在这里)