Realm數(shù)據(jù)庫詳解

Realm,為移動(dòng)設(shè)備而生忍啤。替代 SQLite 和 Core Data。

官方中文文檔:官方文檔

以上是官方文檔胎食,大家看過后有個(gè)大體了解扰才。

說一下我對Realm的認(rèn)識(shí)。

首先它的API調(diào)用特別舒服厕怜,不繁瑣衩匣。

還有一個(gè)好處就是省心蕾总,不用像CoreData那樣復(fù)雜的管理。也不用寫SQL語句琅捏∩伲總之,簡單柄延!

高效蚀浆,開發(fā)中應(yīng)用測試時(shí),無論是那種操作搜吧,都是秒操作市俊。所以性能不是問題。

下面是具體操作(看過官方文檔滤奈,有一定認(rèn)識(shí)后在操作)

我只是復(fù)述一下我對官方文檔的理解摆昧,以及我集成Realm的過程操作

從這里開始(集成過程)

Realm是開源的~,下載方式靜態(tài)庫蜒程,以及官方Demo绅你。下載 Realm OC版(Swift版和OC版是不能共存的):下載OC版Realm

準(zhǔn)備工作

使用 Realm 構(gòu)建應(yīng)用的基本要求:iOS >= 7, OS X >= 10.9 并且支持 WatchKit。昭躺;

需要使用 Xcode 6.4 或者以后的版本忌锯;

程序支持Objective?C, Swift 1.2 & Swift 2.x。

安裝 (這里有好多可選的方式窍仰,看大家喜歡汉规,我用的是靜態(tài)庫)

1.動(dòng)態(tài)框架

2.CocoaPod

3.Carthage

4.靜態(tài)框架(因?yàn)槠渌男枰┠_本)

Realm瀏覽器/數(shù)據(jù)庫管理器

官方提供了一個(gè)名為Realm Browser的Mac應(yīng)用,用來進(jìn)行Realm數(shù)據(jù)的讀取和編輯驹吮。(好用针史,但是每次編譯寫入新數(shù)據(jù)的時(shí)候,之前打開的會(huì)閃退)

Xcode 插件

怎么安裝就不贅述了碟狞,最開始的時(shí)候我會(huì)用啄枕,后來用多了,就自己手動(dòng)建模型類了族沃。

API手冊

能查詢Realm的完整版API手冊频祝,里面包含了所有類和方法等信息。

示例

官方Demo里有(好多脆淹,而且是英文不是很懂)

數(shù)據(jù)模型(Model)

Realm數(shù)據(jù)模型是基于標(biāo)準(zhǔn) Objective?C 類來進(jìn)行定義的常空,使用屬性來完成模型的具體定義。

通過簡單的繼承RLMObject或者一個(gè)已經(jīng)存在的模型類盖溺,您就可以創(chuàng)建一個(gè)新的 Realm 數(shù)據(jù)模型對象漓糙。

Realm模型對象在形式上基本上與其他 Objective?C 對象相同 - 您可以給它們添加您自己的方法(method)和協(xié)議(protocol),和在其他對象中使用類似烘嘱。

主要的限制是某個(gè)對象只能在其被創(chuàng)建的那個(gè)線程中使用, 并且您無法訪問任何存儲(chǔ)屬性的實(shí)例變量(ivar)昆禽。

如果您安裝了我們的Xcode插件蝗蛙,那么可在”New File…“對話框中會(huì)有一個(gè)很漂亮的模板,可用來創(chuàng)建接口(interface)和執(zhí)行(implementation)文件醉鳖。

您只需要為對象的類型列表添加目標(biāo)類型的屬性捡硅,或者RLMArray,就可以創(chuàng)建數(shù)據(jù)關(guān)系(relationship)和嵌套數(shù)據(jù)結(jié)構(gòu)(nested data structure)盗棵。

我就不用官方文檔里的類說明了壮韭,以下就是實(shí)際項(xiàng)目(gitDemo)中類的創(chuàng)建以及使用

導(dǎo)入項(xiàng)目中的DataStore文件夾

拖進(jìn)來之后(確保拖入時(shí)勾選了 Copy items if needed ),可能會(huì)報(bào)錯(cuò)漾根,查看報(bào)錯(cuò)信息泰涂,(一般是缺少libc++.tbd)

建模型的基類

我將常用的數(shù)據(jù)庫操作已經(jīng)做了封裝,在Store文件夾下是Realm數(shù)據(jù)庫的管理類辐怕,同時(shí)每個(gè)模型類都需要主鍵逼蒙,所以應(yīng)該抽象出父類來持有primaryKey和realmManager是有必要的。

模型類需要跟官方文檔里描述一致需要繼承RLMObject類RLM_ARRAY_TYPE(BasicRealm)定義一個(gè)RLMArray類型(不太明白的可以看一下官方源碼)

#import <Realm/Realm.h>

#import"RLMObject+JSON.h"

#import"XMRealmStoreManager.h"

@interfaceBasicRealm :RLMObject

/**

*本地?cái)?shù)據(jù)庫入庫的主鍵ID

*/

@property(nonatomic,copy)NSString*hostID;

/**

*  realm數(shù)據(jù)管理

*

*  @return realm數(shù)據(jù)管理

*/

+(XMRealmStoreManager*)realmManager;

-(XMRealmStoreManager*)realmManager;

@end
// This protocol enables typed collections. i.e.:

// RLMArray

RLM_ARRAY_TYPE(BasicRealm)

@interfaceBasicModel :NSObject

@property(nonatomic,copy)NSString*hostID;

@end

.m文件的具體方法請從項(xiàng)目中查看

建數(shù)據(jù)模型類

現(xiàn)在就可以根據(jù)項(xiàng)目需求建立明確的模型類寄疏,模型類需要繼承上述的基類BasicRealm是牢。

假如現(xiàn)在的需求是Cell的標(biāo)題下有三張圖片(大家自行腦補(bǔ)一下UI),那么我們需要標(biāo)題屬性陕截,以及一個(gè)圖片鏈接數(shù)組(Realm中不能用NSArray驳棱,需要用RLMArray)屬性聲明如下

#import"BasicModel.h"

RLM_ARRAY_TYPE(ImageRealm)//定義一個(gè)RLMArray類型

@interfaceDataRealm :BasicRealm

@property(nonatomic,copy)NSString*title;

@property(nonatomic,strong)RLMArray * image_url;

@end
@interfaceImageRealm :BasicRealm

@property(nonatomic,copy)NSString*image;

@end

.m中需要重寫兩個(gè)方法

+ (NSDictionary*)JSONInboundMappingDictionary(入庫的keyPath對應(yīng)模型的keyPath)

+ (NSDictionary*)JSONOutboundMappingDictionary(出庫的keyPath對應(yīng)模型的keyPath)
兩個(gè)方法一般內(nèi)容都相同,一般我們寫的模型類都是基于服務(wù)器返回?cái)?shù)據(jù)的KeyPath作為我們數(shù)據(jù)類的屬性名农曲。但當(dāng)服務(wù)器返回的數(shù)據(jù)(比如服務(wù)器數(shù)據(jù)庫的主鍵是id社搅,當(dāng)然你也可以跟服務(wù)端開發(fā)商量一下提前做一下key的更改,畢竟好兄弟~)有一些OC的關(guān)鍵詞比如id這樣的話我們就需要將入(出)庫的keyPath對應(yīng)模型的keyPath做一下映射的更改

@implementationDataRealm

+ (NSDictionary*)JSONInboundMappingDictionary {

return@{

@"hostID":@"hostID",

@"image_url":@"image_url",

@"title":@"title",

};

}

+ (NSDictionary*)JSONOutboundMappingDictionary {

return@{

@"hostID":@"hostID",

@"image_url":@"image_url",

@"title":@"title",

};

}

@end
@implementationImageRealm

+ (NSDictionary*)JSONInboundMappingDictionary {

return@{

@"hostID":@"hostID",

@"image":@"image",

};

}

+ (NSDictionary*)JSONOutboundMappingDictionary {

return@{

@"hostID":@"hostID",

@"image":@"image",

};

}

@end

Realm數(shù)據(jù)模型類的使用

用Realm管理類調(diào)用數(shù)據(jù)的增刪改差

//增or改

-(void)add

{

[[DataRealmrealmManager]writeObjectsWithObjectsBlock:^id(XMRealmOperation*operation,RLMRealm*realm) {

//在這返回一個(gè)id對象可以是一個(gè)包含多個(gè)數(shù)據(jù)庫模型的數(shù)組乳规,也可以是單個(gè)數(shù)據(jù)庫模型對象可以調(diào)用Real自己的解析字典方法形葬,也可以用封裝好的方法(根據(jù)服務(wù)器返回的數(shù)據(jù)類型)

return[DataRealmcreateOrUpdateInRealm:realmwithJSONDictionary:@{@"hostID":@"1",@"title":@"好好學(xué)習(xí)天天向上",@"image_url":@[@{@"hostID":@"1",@"image":@"http://image1"},@{@"hostID":@"2",@"image":@"http://image2"},@{@"hostID":@"3",@"image":@"http://image3"}]}];

//        return [DataRealm createOrUpdateInRealm:realm withJSONArray:@[]];

}completion:^(XMRealmStoreManager*store,XMRealmOperation*operation,RLMRealm*realm) {

//事務(wù)完成后回調(diào)

}];

}
//刪

-(void)delete{

[[DataRealmrealmManager]deleteObjectsWithObjectsBlock:^id(XMRealmOperation*operation,RLMRealm*realm) {

//可以根據(jù)sql語句查找刪除

return[DataRealmobjectsWhere:@""];

//也可以根據(jù)主鍵獲得

return[DataRealmobjectForPrimaryKey:@"1"];

}completion:^(XMRealmStoreManager*store,XMRealmOperation*operation,RLMRealm*realm) {

//事務(wù)完成回調(diào)

}];

}
//查

-(void)search

{

[[DataRealmrealmManager]fetchObjectsWithObjectsBlock:^id(XMRealmOperation*operation,RLMRealm*realm) {

//可以根據(jù)sql語句查找刪除

return[DataRealmobjectsWhere:@""];

//也可以根據(jù)主鍵獲得

return[DataRealmobjectForPrimaryKey:@"1"];

}completion:^(XMRealmStoreManager*store,XMRealmOperation*operation,RLMRealm*realm,RLMResults*results,NSString*primaryKey,NSMutableArray*models) {

//事務(wù)完成回調(diào)獲得查詢內(nèi)容更新UI

}];

}

后語:

我建議大家將數(shù)據(jù)分為兩種類,一種是數(shù)據(jù)庫類暮的,一種是平常我們不做數(shù)據(jù)存儲(chǔ)的類(我在Demo (由于git文件大小限制不能上傳Realm.framework笙以,請大家自行拖入)中是這樣操作的)。這樣做的好處是分開來易于管理冻辩,那些屬性內(nèi)容需要入庫就在數(shù)據(jù)庫類中聲明猖腕,不需要的但是我們UI展示上需要的在單獨(dú)的數(shù)據(jù)類中。這樣數(shù)據(jù)庫中就不需要冗余的key(當(dāng)然也可以通過.m的兩種方法來控制入庫的keyPath)這樣做還有一個(gè)不算原因的原因恨闪,這樣做可以用一些字典轉(zhuǎn)模型的解析類框架(比如MJ倘感,YYModel等)×剩總是這項(xiàng)看個(gè)人喜好吧侠仇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子逻炊,更是在濱河造成了極大的恐慌,老刑警劉巖犁享,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件余素,死亡現(xiàn)場離奇詭異,居然都是意外死亡炊昆,警方通過查閱死者的電腦和手機(jī)桨吊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凤巨,“玉大人视乐,你說我怎么就攤上這事「易拢” “怎么了佑淀?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長彰檬。 經(jīng)常有香客問我伸刃,道長,這世上最難降的妖魔是什么逢倍? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任捧颅,我火速辦了婚禮,結(jié)果婚禮上较雕,老公的妹妹穿的比我還像新娘碉哑。我一直安慰自己,他們只是感情好亮蒋,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布扣典。 她就那樣靜靜地躺著,像睡著了一般宛蚓。 火紅的嫁衣襯著肌膚如雪激捏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天凄吏,我揣著相機(jī)與錄音远舅,去河邊找鬼。 笑死痕钢,一個(gè)胖子當(dāng)著我的面吹牛图柏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播任连,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼蚤吹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起裁着,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤繁涂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后二驰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扔罪,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年桶雀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了矿酵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡矗积,死狀恐怖全肮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情棘捣,我是刑警寧澤辜腺,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站柱锹,受9級特大地震影響哪自,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜禁熏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一壤巷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瞧毙,春花似錦胧华、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至释漆,卻和暖如春悲没,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背男图。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工示姿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逊笆。 一個(gè)月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓栈戳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親难裆。 傳聞我的和親對象是個(gè)殘疾皇子子檀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

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