Realm数据库详解

Realm,为移动设备而生。替代 SQLite 和 Core Data。


官方中文文档:官方文档

以上是官方文档,大家看过后有个大体了解。

说一下我对Realm的认识。

首先它的API调用特别舒服,不繁琐。

还有一个好处就是省心,不用像CoreData那样复杂的管理。也不用写SQL语句。总之,简单!

高效,开发中应用测试时,无论是那种操作,都是秒操作。所以性能不是问题。

下面是具体操作(看过官方文档,有一定认识后在操作)

我只是复述一下我对官方文档的理解,以及我集成Realm的过程操作


从这里开始(集成过程)

Realm是开源的~,下载方式静态库,以及官方Demo。下载 Realm OC版(Swift版和OC版是不能共存的):下载OC版Realm


准备工作

使用 Realm 构建应用的基本要求:iOS >= 7, OS X >= 10.9 并且支持 WatchKit。;

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

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


安装 (这里有好多可选的方式,看大家喜欢,我用的是静态库)

动态框架

CocoaPod

Carthage

静态框架(因为其他的需要些脚本)


Realm浏览器/数据库管理器

官方提供了一个名为Realm Browser的Mac应用,用来进行Realm数          据的读取和编辑。(好用,但是每次编译写入新数据的时候,之前打开的会闪退)


Xcode 插件

怎么安装就不赘述了,最开始的时候我会用,后来用多了,就自己手动建模型类了。


API手册

能查询Realm的完整版API手册,里面包含了所有类和方法等信息。


示例

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


数据模型(Model)

Realm数据模型是基于标准 Objective‑C 类来进行定义的,使用属性来完成模型的具体定义。

通过简单的继承RLMObject或者一个已经存在的模型类,您就可以创建一个新的 Realm 数据模型对象。

Realm模型对象在形式上基本上与其他 Objective‑C 对象相同 - 您可以给它们添加您自己的方法(method)和协议(protocol),和在其他对象中使用类似。

主要的限制是某个对象只能在其被创建的那个线程中使用, 并且您无法访问任何存储属性的实例变量(ivar)。

如果您安装了我们的Xcode插件,那么可在”New File…“对话框中会有一个很漂亮的模板,可用来创建接口(interface)和执行(implementation)文件。

您只需要为对象的类型列表添加目标类型的属性,或者RLMArray,就可以创建数据关系(relationship)和嵌套数据结构(nested data structure)。


我就不用官方文档里的类说明了,以下就是实际项目(gitDemo)中类的创建以及使用

导入项目中的DataStore文件夹

拖进来之后(确保拖入时勾选了 Copy items if needed ),可能会报错,查看报错信息,(一般是缺少libc++.tbd)


建模型的基类

我将常用的数据库操作已经做了封装,在Store文件夹下是Realm数据库的管理类,同时每个模型类都需要主键,所以应该抽象出父类来持有primaryKey和realmManager是有必要的。

模型类需要跟官方文档里描述一致需要继承RLMObject类RLM_ARRAY_TYPE(BasicRealm)定义一个RLMArray类型(不太明白的可以看一下官方源码)

#import

#import"RLMObject+JSON.h"

#import"XMRealmStoreManager.h"

@interfaceBasicRealm :RLMObject

/**

*本地数据库入库的主键ID

*/

@property(nonatomic,copy)NSString*hostID;

/**

*  realm数据管理

*

*  @return realm数据管理

*/

+(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文件的具体方法请从项目中查看


建数据模型类

现在就可以根据项目需求建立明确的模型类,模型类需要继承上述的基类BasicRealm。

假如现在的需求是Cell的标题下有三张图片(大家自行脑补一下UI),那么我们需要标题属性,以及一个图片链接数组(Realm中不能用NSArray,需要用RLMArray)属性声明如下

#import"BasicModel.h"

RLM_ARRAY_TYPE(ImageRealm)//定义一个RLMArray类型

@interfaceDataRealm :BasicRealm

@property(nonatomic,copy)NSString*title;

@property(nonatomic,strong)RLMArray * image_url;

@end

@interfaceImageRealm :BasicRealm

@property(nonatomic,copy)NSString*image;

@end

.m中需要重写两个方法

+ (NSDictionary*)JSONInboundMappingDictionary(入库的keyPath对应模型的keyPath)

+ (NSDictionary*)JSONOutboundMappingDictionary(出库的keyPath对应模型的keyPath)

两个方法一般内容都相同,一般我们写的模型类都是基于服务器返回数据的KeyPath作为我们数据类的属性名。但当服务器返回的数据(比如服务器数据库的主键是id,当然你也可以跟服务端开发商量一下提前做一下key的更改,毕竟好兄弟~)有一些OC的关键词比如id这样的话我们就需要将入(出)库的keyPath对应模型的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数据模型类的使用

用Realm管理类调用数据的增删改差

//增or改

-(void)add

{

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

//在这返回一个id对象可以是一个包含多个数据库模型的数组,也可以是单个数据库模型对象可以调用Real自己的解析字典方法,也可以用封装好的方法(根据服务器返回的数据类型)

return[DataRealmcreateOrUpdateInRealm:realmwithJSONDictionary:@{@"hostID":@"1",@"title":@"好好学习天天向上",@"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) {

//事务完成后回调

}];

}

//删

-(void)delete{

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

//可以根据sql语句查找删除

return[DataRealmobjectsWhere:@""];

//也可以根据主键获得

return[DataRealmobjectForPrimaryKey:@"1"];

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

//事务完成回调

}];

}

//查

-(void)search

{

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

//可以根据sql语句查找删除

return[DataRealmobjectsWhere:@""];

//也可以根据主键获得

return[DataRealmobjectForPrimaryKey:@"1"];

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

//事务完成回调获得查询内容更新UI

}];

}


后语:

我建议大家将数据分为两种类,一种是数据库类,一种是平常我们不做数据存储的类(我在Demo(由于git文件大小限制不能上传Realm.framework,请大家自行拖入)中是这样操作的)。这样做的好处是分开来易于管理,那些属性内容需要入库就在数据库类中声明,不需要的但是我们UI展示上需要的在单独的数据类中。这样数据库中就不需要冗余的key(当然也可以通过.m的两种方法来控制入库的keyPath)这样做还有一个不算原因的原因,这样做可以用一些字典转模型的解析类框架(比如MJ,YYModel等)。总是这项看个人喜好吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容