ReactNative數(shù)據(jù)持久化

使用JS寫App完全是一種不一樣的感受,思維方式跟OC編程很不盡相同,這篇文章主要來說說使用ReactNative的時(shí)候,數(shù)據(jù)是怎么存儲(chǔ)的,也就是ReactNative數(shù)據(jù)持久化有哪些方案??偨Y(jié)的主流開發(fā)中一共有5種方案。如果有更好的存儲(chǔ)方式,可以給我留言。

1.通過RCTRootView的屬性傳值

RCTRootView在初始化的時(shí)候,我們可以從Native這邊通過屬性傳值的方式傳到JS這邊。這也是最簡單的方式。賦值之后我們也能通過rootView.appProperties設(shè)置新的屬性值。

2.AsyncStorage

這是ReactNative官方的數(shù)據(jù)存儲(chǔ)方式,采用鍵值對(duì)存儲(chǔ)的方式,類似于OC中的NSUserDefaults.但是必須區(qū)分的是他和NSUserDefaults存儲(chǔ)的區(qū)域是不一樣的。如果老項(xiàng)目中使用的是NSUserDefaults存儲(chǔ)的數(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:錯(cuò)誤處理

? ? ? ? ? ? ? ?if (errs) {

? ? ? ? ? ? ? ? ?console.log('存儲(chǔ)錯(cuò)誤');

? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ?if (!errs) {

? ? ? ? ? ? ? ? ?console.log('存儲(chǔ)無誤');

? ? ? ? ? ? ? ?}

? ? ? ? ? ?});

? ? ? ?var _this = this;

? ? ? ?AsyncStorage.getItem(keyName,function(errs,result){

? ? ? ? ? ? ? ?//TODO:錯(cuò)誤處理

? ? ? ? ? ? ? ?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的,但有的時(shí)候我們想從之前有的APP里取數(shù)據(jù),那么我們是不是就不能取NSUserDefaults的數(shù)據(jù)呢,答案肯定是可以取的,存取的方式就需要我們自己來寫橋接方式了。這里涉及到Native與JS的通信了,有關(guān)這方面的詳細(xì)知識(shí)我會(huì)在下一個(gè)文檔詳細(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ù)的時(shí)候,就不適合了,這個(gè)時(shí)候我們就會(huì)想起sqlite,sqlite這種跨平臺(tái)的數(shù)據(jù)存儲(chǔ)方式在ReactNative里也有對(duì)應(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是一個(gè)非常優(yōu)秀的存儲(chǔ)方式,這里就不贅述了,官網(wǎng)有很詳細(xì)的使用方法。但是有點(diǎn)遺憾的是,在react-native中只支持iOS8以上。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 使用JS寫App完全是一種不一樣的感受,思維方式跟OC編程很不盡相同,這篇文章主要來說說使用ReactNative...
    梅慶閱讀 14,299評(píng)論 4 31
  • react native 的數(shù)據(jù)存儲(chǔ)有很多種方式,本來我選擇的是 AsyncStorage,但是不知道為什么無法刪...
    走走婷婷1215閱讀 873評(píng)論 0 0
  • 單例模式 適用場景:可能會(huì)在場景中使用到對(duì)象,但只有一個(gè)實(shí)例,加載時(shí)并不主動(dòng)創(chuàng)建,需要時(shí)才創(chuàng)建 最常見的單例模式,...
    Obeing閱讀 2,314評(píng)論 1 10
  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式。簡單...
    舟漁行舟閱讀 8,118評(píng)論 2 17
  • 第一部分:Html Meta標(biāo)簽的組成 Meta標(biāo)簽的name屬性語法格式是:<meta name=”參數(shù)” co...
    嗝喯唲閱讀 1,014評(píng)論 0 0

友情鏈接更多精彩內(nèi)容