总体内容
1、Realm介绍
2、使用教程与辅助工具
3、Realm的具体使用
一、Realm介绍
1.1、Realm是一个跨平台移动数据库引擎,支持iOS、OS X(Objective-C和Swift)以及Android,核心数据引擎C++打造,并不是建立在SQLite之上的ORM, 是拥有独立的数据库存储引擎,具体详情。ORM:对象-关系映射(OBJECT/RELATIONALMAPPING,简称ORM),ORM技术是在对象和关系之间提供了一条桥梁。
1.2、Realm性能:比sqlite, coredata牛逼
1.3、Realm使用方面:相比于sqlite, coredata, 使用起来更加简单, 更易入门。
二、使用教程与辅助工具
Realm 教程页面
,打开后等待一下会自动转化为中文界面
在上面的教程里面我们可以看到有很多语言,我们关注的是 Swift 与 OC,导入Realm方式如下:
导入方式一:CocoaPods 导入Swiftpod 'RealmSwift'OCpod 'Realm'建议在终端运行 pod repo update以使CocoaPods最新的Realm版本。
导入方式二:手动导入,步骤如下根据自己的需要选择相应的 Realm.framework
<2>、前往 Xcode 工程的 “General” 设置选项卡中,从 ios/dynamic/、osx/、tvos/ 或者 watchos/ 目录中,将 Realm.framework 拖曳到 “Embedded Binaries” 部分内。请确保勾选了 Copy items if needed(除非项目中有多个平台都需要使用 Realm ),然后单击 Finish按钮;提示:在把 Realm.framework拖进项目后一定要在 TARGET->General->Embedded Binaries里面把这 Realm.framework添加进来,否则运行会崩溃
添加动态库
<3>、在单元测试目标的 “Build Settings” 中,将 Realm.framework 的父目录添加到 “Framework Search Paths” 部分中;提示这一步一般在你把 Realm.framework 拖进项目就会自动完成
<4>、如果使用了 Realm Swift,请将 Swift/RLMSupport.swift 文件拖曳到 Xcode 工程的文件导航栏中,请确保选中了 Copy items if needed 选择框;
<5>、如果在 iOS、watchOS 或者 tvOS 工程中使用 Realm,请在应用目标的 “Build Phases” 中创建一条新的 “Run Script Phase”,然后将下面这段代码粘贴到脚本文本框内:bash "${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/Realm.framework/strip-frameworks.sh"添加后的效果:
添加后的效果
因为要绕过 App Store 出现的提交 bug, 因此这一步在打包通用二进制文件时是必须的。
2.2、Realm 辅助工具
<1>、Realm Browser: 可视化访问 Realm 数据库,与SqliteManger 打开 Sqlite数据库一样,Realm Browser 用来打开 Realm 数据库
Realm Browser
<2>、Realm在xcode里面使用的插件Alcatraz(有点大),它 可以快速创建Realm可存储模型对象
插件
下载后,打开运行一下
查看是否插件安装成功,创建一个类,滚到最下面看是否有如下图所示:
查看是否插件安装成功
三、Realm的具体使用,
3.1、简单的数据操作:使用 RLMRealm 对象, 保存指定模型
(1)、创建一个模型 Student继承于 RLMObject,看准了不是继承于 NSObject,如果在 2.2 里面安装了插件并运行后,插件生效,就可以快速创建 Realm的model了,如下图
创建属于Realm的model
(2)、在Student类里面定义属性:由于Realm 在自己的引擎内部有很好的语义解释系统,所以 Objective‑C 的许多属性特性将被忽略,如nonatomic, atomic, strong, copy 和 weak 等。 因此为了避免误解,官方推荐在编写数据模型的时候不要使用任何的属性特性。/** 学生的唯一ID */
@property int studentId;
/** 学生的名字 */
@property NSString *studentName;
(3)、创建对象的方式方式一:普通创建Student *student = [[Student alloc]init];
student.studentId = @1;
student.studentName = @"小王";方式二:通过父类 RLMObject 中的方法 initWithValue 快速创建,可以放字典,也可以放数组,如下// 数组
Student *student = [[Student alloc]initWithValue:@[@2,@"小冯"];
// 字典
Student *student = [[Student alloc]initWithValue:@{@"studentId":@2,@"studentName":@"小冯"}];提示:放数组要与 model 里面的属性顺序保持一致,放字典的话键值保持一致
注意:所有的必需属性都必须在对象添加到 Realm 前被赋值
(4)、使用 RLMRealm 对象, 保存指定模型,如下,我们采用 initWithValue 快速创建并保存// 获取RLMRealm对象
RLMRealm *realm = [RLMRealm defaultRealm];
// 创建对象
Student *student = [[Student alloc]initWithValue:@{@"studentId":@2,@"studentName":@"小冯"}];
保存模型方式一:开启事务,写入数据,关闭事务// 开启事务
[realm beginWriteTransaction];
// 写入数据
[realm addObject:student];
// 关闭事务
[realm commitWriteTransaction];
保存模型方式二:使用 block[realm transactionWithBlock:^{
[realm addObject:student];
}];
保存模型方式三[realm transactionWithBlock:^{
[Student createInRealm:realm withValue:@{@"studentId": @3, @"studentName": @"王小二"}];
}];提示:所有的必需属性都必须在对象添加到 Realm 前被赋值,并且使用 Realm 对象写入值保存模型还可以开启线程来保存模型
3.2、使用 RLMRealm 对象, 更新指定模型
更新模型方式一:在事务中直接更新对象Student *student = [[Student alloc]initWithValue:@{@"studentId":@3,@"studentName":@"王小二"}];
RLMRealm *realm = [RLMRealm defaultRealm];
// 保存模型
[realm transactionWithBlock:^{
// 写入数据
[realm addObject:student];
}];
// 更新模型:这里的更新模型一定是被realm所管理的模型
[realm transactionWithBlock:^{
// 写入数据
student.studentName = @"王冲";
}];提示:上面的 student 已经被 realm 所管理,而且已经和磁盘上的对象进行地址映射更新模型一定是被 realm 所管理的模
更新模型方式二:根据 主键 进行更新
(1)、上面的Student我们还没有设置主键,现在在 Student.m 里面设置一下 主键/** 设置主键 */
+(NSString *)primaryKey{
return @"studentId";
}
(2)、在事务中调用方法:[realm addOrUpdateObject:stu2];,如下Student *student = [[Student alloc]initWithValue:@{@"studentId":@3,@"studentName":@"王小二"}];
RLMRealm *realm = [RLMRealm defaultRealm];
// 在事务里面做处理
[realm transactionWithBlock:^{
// 根据主键更新模型
[realm addOrUpdateObject:student];
}];
更新模型方式三:也是根据 主键 进行更新
(1)、设置主键和上面的一样
(2)、在事务中调用方法:[模型类名 createOrUpdateInRealm:realm withValue:值];,举例如下:RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock:^{
[Student createOrUpdateInRealm:realm withValue: