使用JS寫App完全是一種不一樣的感受,思維方式跟OC編程很不盡相同聪蘸,這篇文章主要來說說使用ReactNative的時候,數(shù)據(jù)是怎么存儲的,也就是ReactNative數(shù)據(jù)持久化有哪些方案第煮。總結(jié)的主流開發(fā)中一共有5種方案抑党。如果有更好的存儲方式包警,可以給我留言。
1.通過RCTRootView的屬性傳值
RCTRootView在初始化的時候底靠,我們可以從Native這邊通過屬性傳值的方式傳到JS這邊害晦。這也是最簡單的方式。賦值之后我們也能通過rootView.appProperties設(shè)置新的屬性值暑中。
2.AsyncStorage
這是ReactNative官方的數(shù)據(jù)存儲方式壹瘟,采用鍵值對存儲的方式,類似于OC中的NSUserDefaults.但是必須區(qū)分的是他和NSUserDefaults存儲的區(qū)域是不一樣的鳄逾。如果老項(xiàng)目中使用的是NSUserDefaults存儲的數(shù)據(jù)稻轨,想要通過AsyncStorage來取數(shù)據(jù),我們是取不到數(shù)據(jù)的雕凹。需要注意的是殴俱,AsyncStorage是只能存字符串的政冻,如果你想存放數(shù)字或其他類型的數(shù)據(jù),那就要轉(zhuǎn)換為字符串再存放吧粱挡,這樣看起來赠幕,AsyncStorage確實(shí)沒有那么方便了。其實(shí)NSUserDefaults也有點(diǎn)類似询筏,NSUserDefaults是可以存放字符串和NSNumber類型的數(shù)據(jù)的榕堰。下面說說AsyncStorage的使用方法。
? ? ? var keyName = 'myname';
? ? ? var keyValue = 'qing';
? ? ? AsyncStorage.setItem(keyName,keyValue,function(errs){
? ? ? ? ? ? ? ?//TODO:錯誤處理
? ? ? ? ? ? ? ?if (errs) {
? ? ? ? ? ? ? ? ?console.log('存儲錯誤');
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?if (!errs) {
? ? ? ? ? ? ? ? ?console.log('存儲無誤');
? ? ? ? ? ? ? ?}
? ? ? ? ? ?});
? ? ? ?var _this = this;
? ? ? ?AsyncStorage.getItem(keyName,function(errs,result){
? ? ? ? ? ? ? ?//TODO:錯誤處理
? ? ? ? ? ? ? ?if (!errs) {
? ? ? ? ? ? ? ? ?var num = parseInt(result, 10); //returns 10
? ? ? ? ? ? ? ? ?console.log('result = '+num);
? ? ? ? ? ? ? ? ?_this.setState({
? ? ? ? ? ? ? ? ? ?text:'dafd'
? ? ? ? ? ? ? ? ?});
? ? ? ? ? ? ? ? ?console.log('result = '+_this.state.text);
? ? ? ? ? ? ? ?}
? ? ? ? ? ?});
? ? ? ?AsyncStorage.removeItem(keyName,function(errs) {
? ? ? ? ? ? ? ?if (!errs) {
? ? ? ? ? ? ? ? ?console.log('移除成功');
? ? ? ? ? ? ? ?}
? ? ? ? ?});
3.NSUserDefaults
ReactNative中是無法使用NSUserDefaults的嫌套,但有的時候我們想從之前有的APP里取數(shù)據(jù)逆屡,那么我們是不是就不能取NSUserDefaults的數(shù)據(jù)呢,答案肯定是可以取的踱讨,存取的方式就需要我們自己來寫橋接方式了魏蔗。這里涉及到Native與JS的通信了,有關(guān)這方面的詳細(xì)知識我會在下一個文檔詳細(xì)說明痹筛。先貼代碼吧:
OC:
#import "RCTBridgeModule.h"
@interface RCTSQLManager : NSObject
@end
@implementation RCTSQLManager
RCT_EXPORT_MODULE();
// Available as NativeModules.SQLManager.getUserDefaults
RCT_EXPORT_METHOD(getUserDefaults:(NSString *)inputValue callback:(RCTResponseSenderBlock)callback)
{
?NSString *ret = [[NSUserDefaults standardUserDefaults]objectForKey:inputValue];
?NSLog(@"ret = %@",ret);
?if(!ret){
? ?ret = @"";
?}
?callback(@[ret]);
}
@end
JS:
SQLManager.getUserDefaults('name', (text) => {
? ? console.log('userDefaults='+text);
? ? });
4.react-native-sqlite
前面講述的比較適合存放小并且簡單的數(shù)據(jù)莺治,如果你想存放數(shù)據(jù)結(jié)構(gòu)復(fù)雜的數(shù)據(jù)的時候,就不適合了帚稠,這個時候我們就會想起sqlite谣旁,sqlite這種跨平臺的數(shù)據(jù)存儲方式在ReactNative里也有對應(yīng)的方式,那就是react-native-sqlite滋早。點(diǎn)這里可以進(jìn)行下載
sqlite.open("filename.sqlite", function (error, database) {
? ? ? ? ? ? if (error) {
? ? ? ? ? ? ? console.log("Failed to open database:", error);
? ? ? ? ? ? ? return;
? ? ? ? ? ? }else {
? ? ? ? ? ? ? console.log('open sucess');
? ? ? ? ? ? }
? ? ? ? ? ?建表
? ? ? ? ? ?var sql = "CREATE TABLE UserTable(field varchar(255),LastName varchar(255))";
? ? ? ? ? ?database.executeSQL(sql, [], rowCallback, completeCallback);
? ? ? ? ? ?function rowCallback(rowData) {
? ? ? ? ? ? ?console.log("createTable:", rowData);
? ? ? ? ? ?}
? ? ? ? ? ?查詢
? ? ? ? ? ?var sql = "SELECT * FROM UserTable";
? ? ? ? ? ?database.executeSQL(sql, [], rowCallback, completeCallback);
? ? ? ? ? ?function rowCallback(rowData) {
? ? ? ? ? ? ?console.log("Got row data:", rowData);
? ? ? ? ? ?}
? ? ? ? ? ?插入
? ? ? ? ? ? var insertsql = "insert into UserTable VALUES ('qing', 'Mei')";
? ? ? ? ? ? database.executeSQL(insertsql, [], rowCallback, completeCallback);
? ? ? ? ? ? function rowCallback(rowData) {
? ? ? ? ? ? ? console.log("insert:", rowData);
? ? ? ? ? ? }
? ? ? ? ? ?刪除
? ? ? ? ? ?var deleSql = "DELETE FROM UserTable WHERE LastName = ?";
? ? ? ? ? ?var params = ["Mei"];
? ? ? ? ? ?database.executeSQL(deleSql, params, rowCallback, completeCallback);
? ? ? ? ? ?function rowCallback(rowData) {
? ? ? ? ? ? ?console.log("delete:", rowData);
? ? ? ? ? ?}
? ? ? ? ? ?function completeCallback(error) {
? ? ? ? ? ? ?if (error) {
? ? ? ? ? ? ? ?console.log("Failed to execute query:", error);
? ? ? ? ? ? ? ?return
? ? ? ? ? ? ?}
? ? ? ? ? ? ?console.log("Query complete!");
? ? ? ? ? ? ?database.close(function (error) {
? ? ? ? ? ? ? ?if (error) {
? ? ? ? ? ? ? ? ?console.log("Failed to close database:", error);
? ? ? ? ? ? ? ? ?return
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ?});
? ? ? ? ? ?}
Realm
Realm是一個非常優(yōu)秀的存儲方式榄审,這里就不贅述了,官網(wǎng)有很詳細(xì)的使用方法杆麸。但是有點(diǎn)遺憾的是搁进,在react-native中只支持iOS8以上。