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


230

我在React Native领域还是移动/本地领域仍然是新手,在数据持久性方面我发现文档有些缺乏。

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

我特别想知道:

  • 数据持久性有哪些不同的选择?
  • 对于每种持久性,此持久性有什么限制(即何时不再提供数据)?例如:关闭应用程序,重新启动手机等。
  • 对于每种情况,在iOS和Android中实施之间是否存在差异(除了常规设置以外)?
  • 这些选项与离线访问数据的比较如何?(或者通常如何处理离线访问?)
  • 我还有其他注意事项吗?

谢谢你的帮助!


如果您想存储敏感数据,可以看一下:stackoverflow.com/questions/45547657/…–
朱利安·科德

只是明显地使用了Realm
Fattie

只是使用back4app如果你想要一个简单的解决方案(即parse.com)
Fattie

15
与SO一样,对大批人有用的问题被某个人关闭了……也许这应该告诉SO社区有关“规则”及其应用方式的一些信息?尝试查看有史以来最常用的帖子,看看有多少遵循“规则”。有人听吗?
user2330237

Answers:


286

这是我在确定一些当前应用程序项目的最佳方法时所学到的。

异步存储(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的限制可能会被打破)。

如果要为成千上万的用户设计应用程序,请准备相应地扩展数据后端。


1
那么Redux呢?
HIRA THAKUR,

4
@LeonardoDaCodinchi Redux有助于状态管理,但不提供持久存储功能。
walshie4

1
为什么不将redux-persistent保留在您的列表中?你能补充一下吗?如果是那么糟糕。
Shahzad Mirza,

当我写这篇文章时,我没有花任何时间看与Redux相关的任何东西。我现有的React和React-Native应用程序(现在已经将近两年了,并且仅处于维护模式)不使用它。也许在将来的项目中会出现,这时我可以提供一些公正的评论。
布莱恩·斯科特

1
我喜欢你摆放一切的方式。最好为它们每个都添加优点和缺点(以及其文档的链接)。就像我发现的那样AsyncStorage,Android仅支持6 MB,而iOS没有这样的限制。
Jimit Patel

58

快速又肮脏:只需将Redux + react-redux + redux-persist + AsyncStorage用于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,由于其设计部分(动作创建者和简化者),offline访问几乎是自动的。

您获取并存储的所有数据均可用,您可以轻松存储其他数据以指示状态(获取,成功,错误)以及获取时间。通常,请求访存不会使较旧的数据无效,并且您的组件只会在收到新数据时进行更新。

另一个方向也是如此。您可以存储要发送到服务器且仍未决的数据并进行相应处理。

我还有其他注意事项吗?

React促进了一种反应式的方式来创建应用程序,而Redux非常适合它。您应该先尝试一下,然后再使用将在常规Android或iOS应用中使用的选项。此外,您会找到更多的文档和帮助。


3
感谢您深入研究AsyncStorage / Redux Persist。我一直在寻找所有选项的概述,所以这是我没有选择它作为正式答案的唯一原因。
新航


1

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

import SyncStorage from 'sync-storage';

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

1

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

否则,请使用内置反应本机异步


0

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

react-redux + AsyncStorage = redux-persist

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

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

只要Redux存储中有一些更改,这就会更新AsyncStorage。

然后加载json转换存储。应用加载时。并再次设置商店。

因为redux-persist在使用wix react-native-navigation时会产生问题。如果是这种情况,那么我更喜欢将简单的redux与上述订户函数一起使用

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.