首页 文章

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

提问于
浏览
105

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

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

我特别想知道:

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

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

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

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

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

谢谢你的帮助!

3 回答

  • 7

    以下是我所学到的内容,因为我确定了推进当前几个应用项目的最佳方式 .

    Async Storage ("built-in" to React Native)

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

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

    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之间编写桥接 .

    [更新2/2018]我已经找到了React Native Firebase,它提供了与本机iOS和Android库兼容的JavaScript接口(执行Google可能/应该做的事情),为您提供本地库的所有好处以及React的奖励原生支持 . 借助Google 's introduction of a JSON document store beside the real-time database, I' m,Firebase可以为我计划构建的一些实时应用提供良好的第二眼 .

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

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

    Realm

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

    它们提供您在自己的服务器或AWS或Azure等 Cloud 解决方案中托管的免费版本的对象存储 . 您还可以创建不与设备持久存储的内存存储,不与服务器同步的仅设备存储,只读服务器存储以及跨一个或多个设备同步的完整读写选项 . 他们拥有专业和企业选项,每月费用比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可能是另一个需要考虑的选择 . 这两者在历史上是相关的,但目前是完全不同的产品 . 见this comparison . ]

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

    MongoDB

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

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

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

    结论:本地只有NoSQL解决方案,没有明显的同步选项,如Realm或Firebase .


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

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

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


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

  • 37

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

  • 139

    快速和脏:只需使用Redux react-redux redux-persist AsyncStorage作为react-native .

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

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

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

    使用react native,您可能希望使用redux和redux-persist . 它可以使用多个存储引擎 . RN的选项是AsyncStorage和redux-persist-filesystem-storage .

    还有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应用程序中使用的选项之前尝试使用它 . 此外,您将找到更多的文档和帮助 .

相关问题