我仍然是React Native世界的新手,通常也是移动/本机世界的新手,我发现文档在数据持久性方面有点缺乏。
我在React Native中存储数据有哪些选择以及每种类型的含义?例如,我看到有本地存储和异步存储,但后来我也看到像Realm这样的东西,我很困惑所有这些都可以用于外部数据库。
我特别想知道:
感谢您的帮助!
答案 0 :(得分:200)
这是我在确定推进当前几个应用项目的最佳方式时所学到的知识。
异步存储("内置"到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选项(&#34; Web&#34;)不提供缓存存储选项(请参阅下面的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云产品完美结合。数据在界面上易于查看和编辑。
<强>服务器强>
还是具有自动网络同步的实时对象存储。他们将自己称为&#34;设备首先&#34;演示视频展示了设备如何处理零星或有损网络连接。
它们提供您在自己的服务器或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 强>
大牌,背后有很多大公司。这是一个具有标准支持成本的Community Edition和Enterprise Edition。
他们在他们的网站上有一个教程,用于连接到React Native。我也没有花太多时间在这个上,但它在功能方面看起来是Realm的可行替代品。我不知道在您的应用或您构建的任何API之外获取数据是多么容易。
[编辑:发现一个较旧的链接,讨论Couchbase和CouchDB,而CouchDB可能是另一个需要考虑的选择。这两者在历史上是相关的,但目前是完全不同的产品。请参阅this comparison。]
结论:看起来具有与Realm类似的功能。可以是仅设备或同步。我需要尝试一下。
<强> MongoDB的强>
我将此服务器端用于本地使用AsyncStorage的应用程序。我喜欢将所有内容存储为JSON对象,使得向客户端设备的传输非常简单。在我的使用案例中,它被用作电视指南数据的上游提供商和我的客户端设备之间的缓存。
数据没有硬结构,如模式,因此每个对象都存储为&#34;文档&#34;这很容易搜索,可过滤等。类似的JSON对象可以有其他(但不同的)属性或子对象,在构造对象/数据的方式上有很大的灵活性。
我没有尝试任何客户端到服务器同步功能,也没有使用它嵌入式。确实存在针对MongoDB的React Native代码。
结论:仅本地NoSQL解决方案,没有明显的同步选项,如Realm或Firebase。
[2009年2月更新]
MongoDB有一个&#34;产品&#34; (或服务)称为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 Sync
同步的另一个NoSQL选项是Twilio的同步。从他们的网站: &#34; Sync允许您实时管理任意数量的设备,无需处理任何后端基础设施。&#34;
我认为这是上述项目之一的Firebase的替代品,特别是在与两个团队交谈之后。我也喜欢他们的其他通讯工具,并使用它们从简单的网络应用程序发送短信更新。
[/更新]
[编辑]自从我最初写这篇文章以来,我已经花了一些时间与Realm合作。我喜欢我不必编写API来同步应用和服务器之间的数据,类似于Firebase。无服务器函数对这两个函数看起来也非常有用,限制了我必须编写的后端代码量。
我喜欢MongoDB数据存储的灵活性,因此这成为我选择基于Web和其他连接所需应用程序的服务器端。
我找到了RESTHeart,它为MongoDB创建了一个非常简单,可扩展的RESTful API。构建一个读取和写入JSON对象的React(Native)组件并不难,RESTHeart又将它们传递给MongoDB或从MongoDB传递。
[编辑]我添加了有关数据存储方式的信息。有时,了解在开发和测试过程中您可能需要做多少工作,如果您需要调整和测试数据,这一点非常重要。
[更新2/2019]在过去的一年(2018年)设计高并发项目时,我尝试了其中几个选项。他们中的一些人在他们的文档中提到了硬性和软性并发限制(据我所知,Firebase在10,000个连接上有一个很难的连接,而Twilio是一个可能受到冲击的软限制,根据与AltConf的两个团队的讨论)。
如果您要为数十到数十万用户设计应用,请准备相应地扩展数据后端。
答案 1 :(得分:46)
快速而肮脏:只需使用Redux + react-redux + redux-persist + AsyncStorage作为本地反应。
它几乎完全符合反应原生世界,并且像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,由于其设计部件(动作创建者和减速器),offiline访问几乎是自动的。
您获取和存储的所有数据都可用,您可以轻松存储额外数据以指示状态(获取,成功,错误)以及获取的时间。通常情况下,请求获取不会使旧数据无效,并且您的组件只会在收到新数据时更新。
同样适用于另一个方向。您可以存储要发送到服务器的数据以及仍处于待处理状态的数据,并相应地处理它。
我还应该记住其他任何考虑事项吗?
React促进了创建应用程序的反应方式,而Redux非常适合它。您应该在使用常规Android或iOS应用程序中使用的选项之前尝试使用它。此外,你会发现更多的文档和帮助。
答案 2 :(得分:8)
上面的人注意到了正确的存储注释,但如果您还需要考虑需要存储的任何PII数据,那么您也可以使用https://github.com/oblador/react-native-keychain之类的东西存入密钥链,因为ASyncStorage是未加密的。它可以作为持久化配置的一部分应用于redux-persist。
答案 3 :(得分:1)
如果要管理复杂的数据类型,可以使用Realm或Sqlite。
否则,请使用内置的反应本机异步
答案 4 :(得分:0)
我们不需要redux-persist,我们可以简单地使用redux进行持久化。
react-redux + AsyncStorage = redux-persist
因此在createdotre文件中只需添加以下行
store.subscribe(async()=> await AsyncStorage.setItem("store", JSON.stringify(store.getState())))
这将在redux存储中进行一些更改时更新AsyncStorage。
然后加载json转换存储。应用加载时。并再次设置商店。
因为redux-persist在使用wix react-native-navigation时会产生问题。如果是这种情况,那么我更喜欢将简单的redux与上述订阅者功能配合使用
答案 5 :(得分:0)
您可以使用比异步存储更易于使用的sync storage。 这个库很棒,它使用异步存储来异步保存数据,并使用内存来同步立即加载和保存数据,因此我们将数据异步保存到内存中并在应用程序同步中使用。
import SyncStorage from 'sync-storage';
SyncStorage.set('foo', 'bar');
const result = SyncStorage.get('foo');
console.log(result); // 'bar'