当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用ReactNative时,我有哪些存储数据的选项?(iOS和Android)》经验,为你挑选了3个好方法。

我在React Native世界中仍然是新手,并且通常也在移动/本地世界,我发现文档在数据持久性方面有点缺乏.

我在React Native中存储数据的选项有哪些?每种类型的含义是什么?例如,我看到有本地存储和异步存储,但后来我也看到像Realm这样的东西,我很困惑所有这些都适用于外部数据库.

我特别想知道:

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

对于每个,持久性的限制是什么(即数据何时不再可用)?例如:关闭应用程序时,重新启动手机等.

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

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

我还应该记住其他任何考虑因素吗?

谢谢你的帮助!



1> Bryan Scott..:

这是我学到的东西,因为我确定了推进几个当前应用项目的最佳方式.

异步存储("内置"到React Native)

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

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

SQLite的

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

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

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

火力地堡

除其他外,Firebase还提供实时noSQL数据库以及JSON文档存储(如MongoDB),旨在保持1到n个客户端的同步.文档讨论了脱机持久性,但仅针对本机代码(Swift/Obj-C,Java).React Native使用的Google自己的JavaScript选项("Web")不提供缓存存储选项(请参阅下面的2/18更新).该库是在假设Web浏览器将要连接的情况下编写的,因此将存在半持久连接.您可以编写本地缓存机制来补充Firebase存储调用,或者您可以在本机库和React Native之间编写桥梁.

[更新2/2018]之后我发现了React Native Firebase,它为本机iOS和Android库提供兼容的JavaScript接口(做Google可能/应该做的事情),为您提供本地库的所有好处和奖励React Native支持.随着谷歌在实时数据库旁边引入了一个JSON文档存储,我给Firebase一个很好的第二眼看看我打算构建的一些实时应用程序.

实时数据库存储为类似JSON的树,您可以在网站上编辑并简单地导入/导出.

结论:使用react-native-firebase,RN可以获得与Swift和Java相同的优势.[/ update]适用于网络连接设备.低利用率的低成本.与其他Google云产品完美结合.数据可通过界面轻松查看和编辑.

领域

也是具有自动网络同步的实时对象存储.他们称自己为"设备优先",演示视频展示了设备如何处理零星或有损网络连接.

它们提供您在自己的服务器或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的

我正在使用此服务器端来处理在本地使用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 -with-the-mongodb-stitch-react-native-sdk).

Twilio同步

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

我认为这是上述项目之一的Firebase的替代品,特别是在与两个团队交谈之后.我也喜欢他们的其他通信工具,并使用它们从简单的Web应用程序发送短信更新.

[/更新]


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

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

我找到了RESTHeart,它为MongoDB创建了一个非常简单,可扩展的RESTful API.构建一个React(Native)组件来读取和写入RESTHeart的JSON对象应该不会太难,而RESTHeart又将它们传递给MongoDB或从MongoDB传递它们.


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


[更新2/2019]在过去一年(2018年)设计高并发性项目时,我尝试了其中几个选项.他们中的一些人在他们的文档中提到了硬性和软性并发限制(据我所知,Firebase在10,000个连接上有一个很难的连接,而Twilio是一个可能受到冲击的软限制,根据与AltConf的两个团队的讨论).

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


@LeonardoDaCodinchi Redux对状态管理有帮助,但不提供持久存储功能.
非常有用的清单,谢谢.也许pouchdb值得一提?

2> Filipe Borge..:

快速而肮脏:只需使用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,您可以定义持久化和不持久化的内容.如果不持久,则在应用程序运行时存在数据.持久化后,数据会在应用程序执行(关闭,打开,重新启动手机等)之间持续存在.

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

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

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

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

使用redux,由于其设计部件(动作创建器和减速器),几乎可以自动进行offiline访问.

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

这同样适用于另一个方向.您可以存储要发送到服务器的数据以及仍处于待处理状态的数据并相应地处理它.

我还应该记住其他任何考虑因素吗?

React提倡创建应用程序的反应方式,Redux非常适合它.您应该在使用常规Android或iOS应用程序中使用的选项之前尝试使用它.此外,您将找到更多的文档和帮助.


感谢您对AsyncStorage/Redux Persist的深入了解.我正在寻找更多关于所有选项的概述,所以这是我没有选择这个作为官方答案的唯一原因.

3> 小智..:

上面的人打了正确的笔记进行存储,但是如果你还需要考虑需要存储的任何PII数据那么你也可以使用https://github.com/oblador/react-native-keychain之类的东西存入钥匙串.因为ASyncStorage是未加密的.它可以作为持久化配置的一部分应用于redux-persist之类的东西.

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有