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
插件在压缩包里面
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
在模拟器存放如下图:
打开如下图:
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];
添加成功
- 删除小红这条数据
RLMRealm *realm = [RLMRealm defaultRealm];
//根据主键查找
Person *person = [Person objectForPrimaryKey:@"119"];
NSLog(@"%@",person.name);
[realm beginWriteTransaction];
[realm deleteObject:person];
[realm commitWriteTransaction];
删除成功
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);
修改成功
数据库
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
中带有小
的
新加了几条数据
查询
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)条件排序
假设要查询所有分组是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);
}
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);
}