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ā)者工具
2.2 插件
用來(lái)快速創(chuàng)建model
插件在壓縮包里面
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
在模擬器存放如下圖:
打開如下圖:
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];
添加成功
- 刪除小紅這條數(shù)據(jù)
RLMRealm *realm = [RLMRealm defaultRealm];
//根據(jù)主鍵查找
Person *person = [Person objectForPrimaryKey:@"119"];
NSLog(@"%@",person.name);
[realm beginWriteTransaction];
[realm deleteObject:person];
[realm commitWriteTransaction];
刪除成功
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);
修改成功
數(shù)據(jù)庫(kù)
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ù)
查詢
RLMResults *results = [Person objectsWhere:@"name contains %@",@"小"];
for (Person *p in results) {
NSLog(@"名字==%@",p.name);
}
查詢成功
也可以使用謂詞查詢:
NSPredicate *pred = [NSPredicate predicateWithFormat:@"name contains %@", @"小"];
RLMResults *results = [Person objectsWithPredicate:pred];
for (Person *p in results) {
NSLog(@"名字==%@",p.name);
}
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);
}
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);
}