Realm使用createInDefaultRealmWithValue的坑

剛開始學習使用Realm時,看到有的示例代碼使用createInDefaultRealmWithValue創(chuàng)建新的Realm對象开睡,有的使用[realm addObject:]創(chuàng)建新對象害驹,對兩者的區(qū)別并不十分清楚鞭呕。直到今天定位一個問題才發(fā)現(xiàn)區(qū)別大了。

    Person *person = [[Person alloc] init];
    person.personId = @"3456";
    person.sex = @"man";
    person.status = YES;
    
    [realm transactionWithBlock:^{
        //        [realm addObject:person];
        [Person createInDefaultRealmWithValue:person];
    }];
    
    Dog *dog1 = [Dog new];
    dog1.num = 1;
    dog1.name = @"aaa";
    [realm transactionWithBlock:^{
        [realm addObject:dog1];
        [person.pets addObject:dog1];
    }];
    NSLog(@"pets count is %zd", person.pets.count);
    [realm transactionWithBlock:^{
        Person* personGet = [Person objectForPrimaryKey:@"3456"];
        NSLog(@"delay pets count is %zd", personGet.pets.count);
        
    }];

見上面的代碼宛官,打印日志結果為:

pets count is 1
delay pets count is 0

看上去[person.pets addObject:dog1]這一句并沒有對RLMArray屬性數(shù)組寫入成功葫松,但也沒有報錯,為什么會有這樣的結果呢底洗?

可以看一下 Realm源碼注釋 解讀 <二> 這里面的一段代碼注釋:

[realm transactionWithBlock:^{
        //存入方式一:aPerson會在存儲的時候根據(jù)KVC賦值給新建的一個Person模型腋么,并將新建的存入realm.(person指針變了)
        [Person createInDefaultRealmWithValue:aPerson];
        [Person createInDefaultRealmWithValue:bPerson];
        //存入方式二:不用新建(person指針不變)
        [realm addObject:aPerson];
        [realm addObject:bPerson];
    }];

重點在于這一句:存入方式一:aPerson會在存儲的時候根據(jù)KVC賦值給新建的一個Person模型,并將新建的存入realm.(person指針變了)亥揖,這說明使用createInDefaultRealmWithValue進行存儲時并不 是直接保存value參數(shù)党晋,而是在內部新建一個Person模型,通過遍歷value參數(shù)的屬性列表對新的Person模型進行賦值的。也就是說使用這種方式時存儲在Realm模型的Person對象與參數(shù)Person對象不是同一個對象未玻,指針是不一樣的,盡管它們的屬性值相同胡控。

這里就要說到一個Realm的修改原則:通過transactionWithBlock對一個模型進行修改時扳剿,這個模型一定要是被Realm管理的模型。通過這個例子昼激,是不是對這句話的理解更透徹庇绽?

另一段示例代碼:

//獲取Realm對象
RLMRealm *realm = [RLMRealm defaultRealm];
Student *stu4 = [[Student alloc]initWithValue:@{@"num": @4, @"name":@"titan4"}];
//添加數(shù)據(jù)
[realm transactionWithBlock:^{
    //添加模型
    [realm addObject:stu4];
    // 這個模型stu, 已經被realm 所管理, 而且, 已經和磁盤上的對象, 進行的地址映射
}];

// 這里修改的模型, 一定是被realm所管理的模型
[realm transactionWithBlock:^{
    stu4.name = @"coder4";
}];

換一種方式來解釋第二段代碼,那就是橙困,[Person createInDefaultRealmWithValue:aPerson]中的參數(shù)aPerson不是被realm管理的模型瞧掺,這個方法返回的Person對象才是;[realm addObject:aPerson]中的參數(shù)aPerson是被realm管理的模型

搞清楚原理了凡傅,那么對第一段的問題代碼辟狈,有3種解決辦法:

  1. Person *person前面加上__block,[Person createInDefaultRealmWithValue:person];改成person=[Person createInDefaultRealmWithValue:person];
  2. [person.pets addObject:dog1]的下一行加入[[RLMRealm defaultRealm] addOrUpdateObject:person]
  3. [Person createInDefaultRealmWithValue:person] 替換成 [realm addObject:person]

顯然使用[realm addObject:person]是最方便最省事的方法夏跷,所以能使用就用[realm addObject:]

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末哼转,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子槽华,更是在濱河造成了極大的恐慌壹蔓,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猫态,死亡現(xiàn)場離奇詭異佣蓉,居然都是意外死亡,警方通過查閱死者的電腦和手機亲雪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門勇凭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人匆光,你說我怎么就攤上這事套像。” “怎么了终息?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵夺巩,是天一觀的道長。 經常有香客問我周崭,道長柳譬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任续镇,我火速辦了婚禮美澳,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己制跟,他們只是感情好舅桩,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著雨膨,像睡著了一般擂涛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上聊记,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天撒妈,我揣著相機與錄音,去河邊找鬼排监。 笑死狰右,一個胖子當著我的面吹牛,可吹牛的內容都是我干的舆床。 我是一名探鬼主播棋蚌,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼峭弟!你這毒婦竟也來了附鸽?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤瞒瘸,失蹤者是張志新(化名)和其女友劉穎坷备,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體情臭,經...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡省撑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了俯在。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝶涩。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡民泵,死狀恐怖简卧,靈堂內的尸體忽然破棺而出座硕,到底是詐尸還是另有隱情,我是刑警寧澤愕提,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布馒稍,位于F島的核電站,受9級特大地震影響浅侨,放射性物質發(fā)生泄漏纽谒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一如输、第九天 我趴在偏房一處隱蔽的房頂上張望鼓黔。 院中可真熱鬧央勒,春花似錦、人聲如沸澳化。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缎谷。三九已至刷晋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間慎陵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工喻奥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留席纽,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓撞蚕,卻偏偏與公主長得像润梯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子甥厦,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內容

  • 這篇直接搬了一份官方文檔過來看的 由于之前沒用markdown搞的亂七八糟的 所以重新做了一份 后面看到官網...
    石丘閱讀 18,014評論 14 24
  • 1纺铭,什么是Realm Realm 于2014 年7月發(fā)布,是一個跨平臺的移動數(shù)據(jù)庫引擎刀疙,專門為移動應用的數(shù)據(jù)持久化...
    璽睿siri閱讀 9,768評論 2 6
  • 一舶赔、Realm 框架 官網地址介紹:(1)、realm 是一個跨庫平臺的移動端數(shù)據(jù)庫引擎,支持 iOS谦秧、OS X ...
    Rui哥閱讀 729評論 0 2
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架竟纳,建立于...
    Hsinwong閱讀 22,396評論 1 92
  • 北方的冬天,徹骨的冷疚鲤,從暖暖的被窩到冷清的公交車上锥累,糾結的冷,風可以從圍脖里躥到腳脖子集歇,凍的直跳腳桶略,想想那可以圍在...
    薛公子鳴魅閱讀 438評論 0 0