Realm簡(jiǎn)單使用

1.介紹

有需要請(qǐng)查看Realm官網(wǎng)

1.1 優(yōu)點(diǎn)-跨平臺(tái)忆某、簡(jiǎn)單易用弃舒、可視化

跨平臺(tái):現(xiàn)在很多應(yīng)用都是要兼顧iOS和Android兩個(gè)平臺(tái)同時(shí)開發(fā)馍忽。如果兩個(gè)平臺(tái)都能使用相同的數(shù)據(jù)庫(kù)棒坏,那就不用考慮內(nèi)部數(shù)據(jù)的架構(gòu)不同遭笋,使用Realm提供的API坝冕,可以使數(shù)據(jù)持久化層在兩個(gè)平臺(tái)上無(wú)差異化的轉(zhuǎn)換瓦呼。

簡(jiǎn)單易用:Core Data 和 SQLite 冗余喂窟、繁雜的知識(shí)和代碼足以嚇退絕大多數(shù)剛?cè)腴T的開發(fā)者,而換用 Realm磨澡,則可以極大地減少學(xué)習(xí)成本稳摄,立即學(xué)會(huì)本地化存儲(chǔ)的方法。毫不吹噓的說(shuō)瘫想,把官方最新文檔完整看一遍,就完全可以上手開發(fā)了。

可視化:Realm 還提供了一個(gè)輕量級(jí)的數(shù)據(jù)庫(kù)查看工具,在Mac Appstore 可以下載Realm Browser這個(gè)工具筹裕,開發(fā)者可以查看數(shù)據(jù)庫(kù)當(dāng)中的內(nèi)容醋闭,執(zhí)行簡(jiǎn)單的插入和刪除數(shù)據(jù)的操作。畢竟朝卒,很多時(shí)候目尖,開發(fā)者使用數(shù)據(jù)庫(kù)的理由是因?yàn)橐峁┮恍┧^的“知識(shí)庫(kù)”。

1.2 安裝

使用CocoaPods安裝
在項(xiàng)目的Podfile中扎运,添加pod 'Realm',在終端運(yùn)行pod install饮戳。

2.輔助工具安裝

2.1 Realm Studio-用于 Realm 數(shù)據(jù)庫(kù)和 Realm 平臺(tái)的開發(fā)者工具

請(qǐng)點(diǎn)擊下載

2.2 插件

用來(lái)快速創(chuàng)建model
插件在壓縮包里面


image

3.Realm的使用

3.1 Realm中的相關(guān)術(shù)語(yǔ)

RLMRealm:Realm是框架的核心所在豪治,是我們構(gòu)建數(shù)據(jù)庫(kù)的訪問(wèn)點(diǎn),就如同Core Data的管理對(duì)象上下文(managed object context)一樣扯罐。出于簡(jiǎn)單起見负拟,realm提供了一個(gè)默認(rèn)的defaultRealm( )的便利構(gòu)造器方法。


RLMObject::這是我們自定義的Realm數(shù)據(jù)模型歹河。創(chuàng)建數(shù)據(jù)模型的行為對(duì)應(yīng)的就是數(shù)據(jù)庫(kù)的結(jié)構(gòu)掩浙。要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)模型,我們只需要繼承RLMObject秸歧,然后設(shè)計(jì)我們想要存儲(chǔ)的屬性即可厨姚。


關(guān)系(Relationships):通過(guò)簡(jiǎn)單地在數(shù)據(jù)模型中聲明一個(gè)RLMObject類型的屬性,我們就可以創(chuàng)建一個(gè)“一對(duì)多”的對(duì)象關(guān)系键菱。同樣地谬墙,我們還可以創(chuàng)建“多對(duì)一”和“多對(duì)多”的關(guān)系。


寫操作事務(wù)(Write Transactions):數(shù)據(jù)庫(kù)中的所有操作经备,比如創(chuàng)建拭抬、編輯,或者刪除對(duì)象侵蒙,都必須在事務(wù)中完成造虎。“事務(wù)”是指位于write閉包內(nèi)的代碼段纷闺。


查詢(Queries):要在數(shù)據(jù)庫(kù)中檢索信息算凿,我們需要用到“檢索”操作。檢索最簡(jiǎn)單的形式是對(duì)Realm( )數(shù)據(jù)庫(kù)發(fā)送查詢消息急但。如果需要檢索更復(fù)雜的數(shù)據(jù)澎媒,那么還可以使用斷言(predicates)、復(fù)合查詢以及結(jié)果排序等等操作波桩。


RLMResults:這個(gè)類是執(zhí)行任何查詢請(qǐng)求后所返回的類戒努,其中包含了一系列的RLMObject對(duì)象。RLMResults和NSArray類似,我們可以用下標(biāo)語(yǔ)法來(lái)對(duì)其進(jìn)行訪問(wèn)储玫,并且還可以決定它們之間的關(guān)系侍筛。不僅如此,它還擁有許多更強(qiáng)大的功能撒穷,包括排序匣椰、查找等等操作。

4. 簡(jiǎn)單使用

4.1 創(chuàng)建模型--創(chuàng)建了Person類

Person.h

#import <Realm/Realm.h>

@interface Person : RLMObject
@property NSString *name;
@property NSInteger age;
@property NSString *cardID;
@property NSString *weight;
@end

// This protocol enables typed collections. i.e.:
// RLMArray<Person *><Person>
RLM_ARRAY_TYPE(Person)

Person.m

#import "Person.h"

@implementation Person

// Specify default values for properties
//主鍵
+ (NSString *)primaryKey
{
    return @"cardID";
}

//需要添加索引的屬性
+ (NSArray *)indexedProperties {
    return @[@"title"];
}

//默認(rèn)屬性值
+ (NSDictionary *)defaultPropertyValues {
    return @{@"weight":@"100"};
}
@end

4.2 存儲(chǔ)數(shù)據(jù)

    RLMRealm *realm = [RLMRealm defaultRealm];
    
    Person *person = [[Person alloc]init];
    person.name = @"小明";
    person.cardID = @"120110";
    [realm beginWriteTransaction];
    [realm addObject:person];
    [realm commitWriteTransaction];

運(yùn)行,打開

RLMRealm defaultRealm在模擬器存放如下圖:

image

打開如下圖:
image

4.3 刪除數(shù)據(jù)

1)刪除指定的數(shù)據(jù):

- (void)deleteObject:(RLMObject *)object;

先來(lái)存兩個(gè)數(shù)據(jù)

    RLMRealm *realm = [RLMRealm defaultRealm];
    
    Person *person = [[Person alloc]init];
    person.name = @"小明";
    person.cardID = @"120110";
    
    Person *person1 = [[Person alloc]init];
    person1.name = @"小紅";
    person1.cardID = @"119";
    
    [realm beginWriteTransaction];
    [realm addObject:person];
    [realm addObject:person1];
    [realm commitWriteTransaction];

添加成功


image
  • 刪除小紅這條數(shù)據(jù)
    RLMRealm *realm = [RLMRealm defaultRealm];
    //根據(jù)主鍵查找
    Person *person = [Person objectForPrimaryKey:@"119"];
    NSLog(@"%@",person.name);
    [realm beginWriteTransaction];
    [realm deleteObject:person];
    [realm commitWriteTransaction];

刪除成功


image

2)刪除一組數(shù)據(jù):

- (void)deleteObjects:(id)array;

3)刪除全部的數(shù)據(jù):

- (void)deleteAllObjects;

4.4 修改數(shù)據(jù)

修改數(shù)據(jù)如果該條數(shù)據(jù)不存在則會(huì)新建一條數(shù)據(jù)端礼。

1)針對(duì)單個(gè)數(shù)據(jù)進(jìn)行的修改或新增:

- (void)addOrUpdateObject:(RLMObject *)object;

  • 例子:把小明的名字改成小小
    RLMRealm *realm = [RLMRealm defaultRealm];
    //根據(jù)主鍵查找
    Person *person = [Person objectForPrimaryKey:@"120110"];
    NSLog(@"%@",person.name);
    [realm beginWriteTransaction];
    person.name = @"小小";
    [realm addOrUpdateObject:person];
    [realm commitWriteTransaction];
    NSLog(@"%@",person.name);

修改成功

image

數(shù)據(jù)庫(kù)


image

2)針對(duì)一組數(shù)據(jù)的修改或新增:

- (void)addOrUpdateObjectsFromArray:(id)array;

說(shuō)明:對(duì)于增加禽笑、刪除、修改必須要在事務(wù)中進(jìn)行操作蛤奥。

4.5 查詢數(shù)據(jù)

1)查詢?nèi)繑?shù)據(jù)

RLMResults *results = [Person allObjects];

或指定Realm數(shù)據(jù)庫(kù):

NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *realmPath = [path stringByAppendingPathComponent:@"你數(shù)據(jù)庫(kù)的名字.realm"];
RLMRealm *realm = [RLMRealm realmWithPath:realmPath];
RLMResults *results = [Person allObjectsInRealm:realm];

2)條件查詢

查詢name中帶有

新加了幾條數(shù)據(jù)


image

查詢

    RLMResults *results = [Person objectsWhere:@"name contains %@",@"小"];
    for (Person *p in results) {
        NSLog(@"名字==%@",p.name);
    }

查詢成功


image

也可以使用謂詞查詢:

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"name contains %@", @"小"];
    RLMResults *results = [Person objectsWithPredicate:pred];
    for (Person *p in results) {
        NSLog(@"名字==%@",p.name);
    }

image

3)條件排序

假設(shè)要查詢所有分組是iOS和作者是zengjing的文章佳镜,然后篩選出來(lái)的結(jié)果按照num字段進(jìn)行遞增排序:

    RLMResults *results = [[Person objectsWhere:@"name contains %@",@"小"] sortedResultsUsingKeyPath:@"age" ascending:YES];
    for (Person *p in results) {
        NSLog(@"名字=%@,age=%ld",p.name,(long)p.age);
    }

image

4)鏈?zhǔn)讲樵?結(jié)果過(guò)濾)

假設(shè)要查詢所有所屬分組是iOS的文章,然后從中篩選出作者是zengjing的數(shù)據(jù):

    RLMResults *results1 = [Person objectsWhere:@"name contains %@",@"小"];
    RLMResults *results2 = [results1 objectsWhere:@"age = '11'"];
    for (Person *p in results2) {
        NSLog(@"名字=%@,age=%ld",p.name,(long)p.age);
    }
image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凡桥,一起剝皮案震驚了整個(gè)濱河市蟀伸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缅刽,老刑警劉巖啊掏,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異衰猛,居然都是意外死亡迟蜜,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門啡省,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)小泉,“玉大人,你說(shuō)我怎么就攤上這事冕杠∥㈡ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵分预,是天一觀的道長(zhǎng)兢交。 經(jīng)常有香客問(wèn)我,道長(zhǎng)笼痹,這世上最難降的妖魔是什么配喳? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮凳干,結(jié)果婚禮上晴裹,老公的妹妹穿的比我還像新娘。我一直安慰自己救赐,他們只是感情好涧团,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般泌绣。 火紅的嫁衣襯著肌膚如雪钮追。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天阿迈,我揣著相機(jī)與錄音元媚,去河邊找鬼。 笑死苗沧,一個(gè)胖子當(dāng)著我的面吹牛刊棕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播待逞,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼鞠绰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了飒焦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤屿笼,失蹤者是張志新(化名)和其女友劉穎牺荠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驴一,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡休雌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肝断。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杈曲。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖胸懈,靈堂內(nèi)的尸體忽然破棺而出担扑,到底是詐尸還是另有隱情,我是刑警寧澤趣钱,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布涌献,位于F島的核電站,受9級(jí)特大地震影響首有,放射性物質(zhì)發(fā)生泄漏燕垃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一井联、第九天 我趴在偏房一處隱蔽的房頂上張望卜壕。 院中可真熱鬧,春花似錦烙常、人聲如沸轴捎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)轮蜕。三九已至昨悼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間跃洛,已是汗流浹背率触。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汇竭,地道東北人葱蝗。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像细燎,于是被迫代替她去往敵國(guó)和親两曼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

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

  • 數(shù)據(jù)庫(kù)——android四大存儲(chǔ)之一玻驻,說(shuō)實(shí)話已經(jīng)很久沒有使用了悼凑,平時(shí)是要使用網(wǎng)絡(luò)與文件存儲(chǔ),除非是需要離線模式璧瞬,或...
    淺笑夏沫閱讀 999評(píng)論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理户辫,服務(wù)發(fā)現(xiàn),斷路器嗤锉,智...
    卡卡羅2017閱讀 134,716評(píng)論 18 139
  • 這張劇照大家應(yīng)該都知道吧?它是《新白娘子傳奇》中访诱,白娘子許仙斷橋相會(huì)最經(jīng)典的照片垫挨。那時(shí)候的白娘子,是億萬(wàn)觀眾心中的...
    悠然見茅屋閱讀 1,794評(píng)論 32 10
  • 當(dāng)提起休?杰克曼触菜,人們往往將他與金剛狼聯(lián)系在一起棒拂。仿佛在銀幕內(nèi)外,休都是那樣一個(gè)強(qiáng)壯而粗獷的存在玫氢。 沒錯(cuò)帚屉,他是“狼...
    狂暴的索理子閱讀 921評(píng)論 0 1
  • 一、關(guān)于生活中的小確幸: 1漾峡、昨天出去吃了個(gè)夜宵攻旦,結(jié)果昨天晚上自虐到1點(diǎn)多,不過(guò)還是堅(jiān)持寫完了“365天踐行”這個(gè)...
    清風(fēng)_bd61閱讀 176評(píng)論 0 0