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

使用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以上。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昔头,一起剝皮案震驚了整個濱河市饼问,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌揭斧,老刑警劉巖莱革,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異未蝌,居然都是意外死亡驮吱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門萧吠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來左冬,“玉大人,你說我怎么就攤上這事纸型∧磁椋” “怎么了梅忌?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長除破。 經(jīng)常有香客問我牧氮,道長,這世上最難降的妖魔是什么瑰枫? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任踱葛,我火速辦了婚禮,結(jié)果婚禮上光坝,老公的妹妹穿的比我還像新娘尸诽。我一直安慰自己,他們只是感情好盯另,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布性含。 她就那樣靜靜地躺著,像睡著了一般鸳惯。 火紅的嫁衣襯著肌膚如雪商蕴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天芝发,我揣著相機(jī)與錄音绪商,去河邊找鬼。 笑死后德,一個胖子當(dāng)著我的面吹牛部宿,可吹牛的內(nèi)容都是我干的抄腔。 我是一名探鬼主播瓢湃,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赫蛇!你這毒婦竟也來了绵患?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤悟耘,失蹤者是張志新(化名)和其女友劉穎落蝙,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暂幼,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡筏勒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了旺嬉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片管行。...
    茶點(diǎn)故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖邪媳,靈堂內(nèi)的尸體忽然破棺而出捐顷,到底是詐尸還是另有隱情荡陷,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布迅涮,位于F島的核電站废赞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏叮姑。R本人自食惡果不足惜唉地,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望传透。 院中可真熱鬧渣蜗,春花似錦、人聲如沸旷祸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽托享。三九已至骚烧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間闰围,已是汗流浹背赃绊。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留羡榴,地道東北人碧查。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像校仑,于是被迫代替她去往敵國和親忠售。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容

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