最近在调研RN的本地存储,发现目前RN的本地存储大多数最终调的都是端的sqlite(ios上可能区分大小文件使用不同存储系统),只是根据不用的封装有几个典型的库:
1.AsyncStorage
官方文档里推荐使用的存储方案。提供的是一个简单的、异步的、持久化的Key-Value存储系统。
优点:
- (1)使用简单,常用的API同localstorage;
- (2)异步机制,带了成功失败回调,方便向业务靠拢;
- (3)目前有一个不错的库,对存储条数、过期时间等做了封装。
存在问题:
- (1)Key-Value存储系统不好应对复杂数据处理(所以要考虑好需要存储的内容);
- (2)存储上限的问题。
这是一篇react-native讨论存储上限的 issues,目前Android默认的上限是6M,看源码,我们发现可以通过重写setMaximumSize的方式来扩大上限,代码类似如下:
long size = 50L * 1024L * 1024L; // 50 MB
com.facebook.react.modules.storage.ReactDatabaseSupplier.getInstance(getApplicationContext()).setMaximumSize(size);`
IOS上的存储是区分大小的,官方是这么说的
AsyncStorage is backed by native code that stores small values in a serialized dictionary and larger values in separate files.
在stackoverflow找到,好像上限是2G。这样似乎存储比想象中大,另外我也给之前提到react-native-storage库的作者提了上限防爆机制的issues,加之我们在使用上注意,这一点暂时可以放心。
2.react-native-sqlite-storage
react-native-sqlite-storage是对端的sqlite封装,api设计上最接近sqlite,接入需要引入模块,使用场景:需要复杂大量数据的处理
3.Realm
Realm是一个适应多平台,功能强大的数据库,它也支持React Native。Realm底层既不使用sqlite也不使用coredata,它有一套自己的数据库存储引擎,官方说在性能上也高于sqlite和coredata很多,而且api更偏向nosql,比起sqlite的方式简单。确定就是有一定的学习陈本,扩展性不高,只支持IOS8+。
4.总结
在项目前期,AsyncStorage已经能很好的满足需求,并且简单、易扩展,建议使用。等到遇到瓶颈时,再考虑是否接入其它两种。