Realm简单使用

1.介绍

有需要请查看Realm官网

1.1 优点-跨平台、简单易用、可视化

跨平台:现在很多应用都是要兼顾iOS和Android两个平台同时开发。如果两个平台都能使用相同的数据库,那就不用考虑内部数据的架构不同,使用Realm提供的API,可以使数据持久化层在两个平台上无差异化的转换。

简单易用:Core Data 和 SQLite 冗余、繁杂的知识和代码足以吓退绝大多数刚入门的开发者,而换用 Realm,则可以极大地减少学习成本,立即学会本地化存储的方法。毫不吹嘘的说,把官方最新文档完整看一遍,就完全可以上手开发了。

可视化:Realm 还提供了一个轻量级的数据库查看工具,在Mac Appstore 可以下载Realm Browser这个工具,开发者可以查看数据库当中的内容,执行简单的插入和删除数据的操作。毕竟,很多时候,开发者使用数据库的理由是因为要提供一些所谓的“知识库”。

1.2 安装

使用CocoaPods安装
在项目的Podfile中,添加pod 'Realm',在终端运行pod install

2.辅助工具安装

2.1 Realm Studio-用于 Realm 数据库和 Realm 平台的开发者工具

请点击下载

2.2 插件

用来快速创建model
插件在压缩包里面


image

3.Realm的使用

3.1 Realm中的相关术语

RLMRealm:Realm是框架的核心所在,是我们构建数据库的访问点,就如同Core Data的管理对象上下文(managed object context)一样。出于简单起见,realm提供了一个默认的defaultRealm( )的便利构造器方法。


RLMObject::这是我们自定义的Realm数据模型。创建数据模型的行为对应的就是数据库的结构。要创建一个数据模型,我们只需要继承RLMObject,然后设计我们想要存储的属性即可。


关系(Relationships):通过简单地在数据模型中声明一个RLMObject类型的属性,我们就可以创建一个“一对多”的对象关系。同样地,我们还可以创建“多对一”和“多对多”的关系。


写操作事务(Write Transactions):数据库中的所有操作,比如创建、编辑,或者删除对象,都必须在事务中完成。“事务”是指位于write闭包内的代码段。


查询(Queries):要在数据库中检索信息,我们需要用到“检索”操作。检索最简单的形式是对Realm( )数据库发送查询消息。如果需要检索更复杂的数据,那么还可以使用断言(predicates)、复合查询以及结果排序等等操作。


RLMResults:这个类是执行任何查询请求后所返回的类,其中包含了一系列的RLMObject对象。RLMResults和NSArray类似,我们可以用下标语法来对其进行访问,并且还可以决定它们之间的关系。不仅如此,它还拥有许多更强大的功能,包括排序、查找等等操作。

4. 简单使用

4.1 创建模型--创建了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"];
}

//默认属性值
+ (NSDictionary *)defaultPropertyValues {
    return @{@"weight":@"100"};
}
@end

4.2 存储数据

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

运行,打开

RLMRealm defaultRealm在模拟器存放如下图:

image

打开如下图:
image

4.3 删除数据

1)删除指定的数据:

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

先来存两个数据

    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
  • 删除小红这条数据
    RLMRealm *realm = [RLMRealm defaultRealm];
    //根据主键查找
    Person *person = [Person objectForPrimaryKey:@"119"];
    NSLog(@"%@",person.name);
    [realm beginWriteTransaction];
    [realm deleteObject:person];
    [realm commitWriteTransaction];

删除成功


image

2)删除一组数据:

- (void)deleteObjects:(id)array;

3)删除全部的数据:

- (void)deleteAllObjects;

4.4 修改数据

修改数据如果该条数据不存在则会新建一条数据。

1)针对单个数据进行的修改或新增:

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

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

修改成功

image

数据库


image

2)针对一组数据的修改或新增:

- (void)addOrUpdateObjectsFromArray:(id)array;

说明:对于增加、删除、修改必须要在事务中进行操作。

4.5 查询数据

1)查询全部数据

RLMResults *results = [Person allObjects];

或指定Realm数据库:

NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *realmPath = [path stringByAppendingPathComponent:@"你数据库的名字.realm"];
RLMRealm *realm = [RLMRealm realmWithPath:realmPath];
RLMResults *results = [Person allObjectsInRealm:realm];

2)条件查询

查询name中带有

新加了几条数据


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)条件排序

假设要查询所有分组是iOS和作者是zengjing的文章,然后筛选出来的结果按照num字段进行递增排序:

    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)链式查询(结果过滤)

假设要查询所有所属分组是iOS的文章,然后从中筛选出作者是zengjing的数据:

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

推荐阅读更多精彩内容

  • 数据库——android四大存储之一,说实话已经很久没有使用了,平时是要使用网络与文件存储,除非是需要离线模式,或...
    浅笑夏沫阅读 972评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 这张剧照大家应该都知道吧?它是《新白娘子传奇》中,白娘子许仙断桥相会最经典的照片。那时候的白娘子,是亿万观众心中的...
    悠然见茅屋阅读 1,770评论 32 10
  • 当提起休•杰克曼,人们往往将他与金刚狼联系在一起。仿佛在银幕内外,休都是那样一个强壮而粗犷的存在。 没错,他是“狼...
    狂暴的索理子阅读 869评论 0 1
  • 一、关于生活中的小确幸: 1、昨天出去吃了个夜宵,结果昨天晚上自虐到1点多,不过还是坚持写完了“365天践行”这个...
    清风_bd61阅读 170评论 0 0