最近在調研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已經能很好的滿足需求,并且簡單、易擴展,建議使用。等到遇到瓶頸時,再考慮是否接入其它兩種。