前言:本篇博客将介绍Realm的一些高级用法,基本使用在这里

一、配置一对多关系

 //
// Teacher.h #import <Realm/Realm.h>
#import "Student.h" @interface Teacher : RLMObject @property NSInteger _ID;
@property NSString *name;
@property NSInteger age;
@property NSString *sex;
@property RLMArray<Student *><Student> *students; @end
 //  Student.h

 #import <Realm/Realm.h>

 @interface Student : RLMObject

 @property NSString *name;
@property(readonly) RLMLinkingObjects *teacher; @end RLM_ARRAY_TYPE(Student)

解析:1、假设现在Teacher为一的这一端多即是指Student(PS:虽然一个学生也可以对应多个老师,本例只是说明问题请勿纠结细节)

2、在多的这个属性上用RLMArray修饰之前必须在多的这一端即Student中添加一个宏RLM_ARRAY_TYPE

插入数据

 RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock:^{
Teacher *teacherWan = [[Teacher alloc]init];
teacherWan._ID = _IDNumber;
teacherWan.name = @"小明";
teacherWan.age = ;
teacherWan.sex = @"male"; Student *stu1 = [[Student alloc]init];
stu1.name = @"旺财"; Student *stu2 = [[Student alloc]init];
stu2.name = @"来福";
[teacherWan.students addObject:stu1];
[teacherWan.students addObject:stu2];
[realm addObject:teacherWan]; [realm commitWriteTransaction];
}];

查询数据

二、反向链接

 //  Student.m

 #import "Student.h"
#import "Teacher.h" @implementation Student //反向链接
+ (NSDictionary *)linkingObjectsProperties {
return @{
@"teacher": [RLMPropertyDescriptor descriptorWithClass:Teacher.class propertyName:@"students"],
};
} @end

解析:1、借助链接对象属性,您可以通过指定的属性来获取所有链接到指定对象的对象。例如,一个 Teacher 对象可以拥有一个名为 students 的链接对象属性,这个属性中包含了某些 Student 对象,而这些 Student 对象在其 teacher 属性中包含了这一个确定的 Teacher 对象。您可以将 teacher 属性设置为 RLMLinkingObjects 类型,然后重写 +[RLMObject linkingObjectsProperties] 来指明关系,说明 student 中包含了 Teacher 模型对象。(引用官网解释)

2、其实就是可以通过一的这一端可以知道多的有哪些,从多的这一端可以知道与其关联的一是什么。(个人理解)

三、版本兼容

PS: 一个应用难免要进行版本升级,而版本升级中往往需要将对原有对象的结构进行更改,可能是删除了一个表或者是在一张表中添加了一个字段又或者是把一个表的字段名更改了。当版本更新时,我们又需要保留用户在上一个版本中保存的一些信息,如果我们不做版本兼容,那就意味着原有数据将会丢失。

1、在AppDelegate中添加以下代码

 RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
config.schemaVersion = ;
NSLog(@"%llu", config.schemaVersion);
config.migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion) {
if (oldSchemaVersion < ){
NSLog(@"-------%llu", oldSchemaVersion);
[migration renamePropertyForClass:Person.className oldName:@"name" newName:@"nickName"];
} if (oldSchemaVersion < ){
NSLog(@"-------%llu", oldSchemaVersion);
[migration deleteDataForClassName:@"Human"];
} if (oldSchemaVersion < ){
NSLog(@"-------%llu", oldSchemaVersion);
[migration deleteDataForClassName:@"Cat"];
}
};
[RLMRealmConfiguration setDefaultConfiguration:config];
[RLMRealm defaultRealm];

解析:1、记录数据仓库的版本号config.schemaVersion 默认从0开始,每一次升级的number必须比上一次大

2、如果需要修改一个表的字段,只需先修改对应对象的属性名,然后再在版本兼容中调用migration 的renamePropertyForClass方法

3、如需在一张表中添加或删除一个字段,只需要在对应的对象中添加或删除属性即可,在应用启动时会自动添加或删除

4、如需添加一张表,也只需要创建一个新的RLMObject对象子类即可

5、如需删除一张表,先将该对象删除,然后同理在版本兼容中调用migration 的deleteDataForClassName方法

Realm的一对多配置以及版本兼容的更多相关文章

  1. APP接口版本兼容的问题

    现在基本每个公司都做APP,所以大家都面临 APP接口版本兼容的问题. iOS和android 要不断开发新版本,很多服务端开发都是在以前接口的逻辑上进行修改.新的APP和接口开发后,接口如何兼容老的 ...

  2. Microsoft ReportViewer 控件类型版本兼容问题及解决方法

    错误 Parser Error Message: The base class includes the field 'rvEquipment', but its type (Microsoft.Re ...

  3. 模块XXXX可能与您正在运行的Windows版本不兼容。检查该模块是否与regsvr32.exe的x86(32位)x64(64位)版本兼容。

    最近自己在编写ActiveX控件.遇到的麻烦事不少. 今天遇到了这个问题“模块XXXX可能与您正在运行的Windows版本不兼容.检查该模块是否与regsvr32.exe的x86(32位)x64(64 ...

  4. 我的Android进阶之旅------>Android中高低API版本兼容使用@TargetApi或者@SuppressLint("NewApi")

    Android中高低API版本兼容使用@TargetApi或者@SuppressLint("NewApi") 例如:AndroidManifest.xml中,我们配置了sdk版本的 ...

  5. Java SE 9 多版本兼容 JAR 包示例

    Java SE 9 多版本兼容 JAR 包示例 作者:Grey 原文地址:Java SE 9 多版本兼容 JAR 包示例 说明 Java 9 版本中增强了Jar 包多版本字节码文件格式支持,也就是说在 ...

  6. RoseRT配置高版本的编译器

    RoseRT配置高版本的VC++ ,我有VC++2008 Express ,实习时下载滴! 感谢Google,感谢大神地指导!困扰的问题终于解决,豁然开朗,so开始吧! 第一大步:重中之重, 确保nm ...

  7. 您的项目引用了最新实体框架;但是,找不到数据链接所需的与版本兼容的实体框架数据库 EF6使用Mysql的技巧

    转载至: http://www.cnblogs.com/Imaigne/p/4153397.html 您的项目引用了最新实体框架:但是,找不到数据链接所需的与版本兼容的实体框架数据库 EF6使用Mys ...

  8. ibatis mybatis sql语句配置 符号不兼容 大于号 小于号<!CDATA[ ]>

    ibatis mybatis sql语句配置 符号不兼容 大于号 小于号<!CDATA[ ]> 因为这个是xml格式的,所以不允许出现类似">"这样的字符,但是都 ...

  9. MAC下 JDK环境配置、版本切换以及ADB环境配置

    网上方法,自己总结:亲测可行! 一.JDK环境配置.版本切换: 通过命令’jdk6′, ‘jdk7′,’jdk8’轻松切换到对应的Java版本: 1.首先安装所有的JDk:* Mac自带了的JDK6, ...

随机推荐

  1. 【原创】Android 5.0 BLE低功耗蓝牙从设备应用

    如果各位觉得有用,转载+个出处. 现如今安卓的低功耗蓝牙应用十分普遍了,智能手环.手表遍地都是,基本都是利用BLE通信来交互数据.BLE基本在安卓.IOS两大终端设备上都有很好支持,所以有很好发展前景 ...

  2. 洛谷【P2393】题解

    P2393 [yyy loves Maths II] 原题链接 话说,这题其实方法对了,也蛮水的. 首先方法是一样的,直接扩大忽略精度问题. 其次,我用了c++的函数控制输出小数位数,方法:cout& ...

  3. tpcc-mysql的使用

    1.tpcc-mysql的业务逻辑及其相关的几个表作用:      New-Order:新订单,一次完整的订单事务,几乎涉及到全部表      Payment:支付,主要对应 orders.histo ...

  4. 基于Spring的轻量级工作流框架

    项目地址 码云:https://git.oschina.net/null_584_3382/business-flow-parent github:https://github.com/Athlizo ...

  5. 基于webpack2.x的vue2.x的多页面站点

    vue的多页面 依旧使用vue-cli来初始化我们的项目 然后修改主要目录结构如下: ├── build │   ├── build.js │   ├── check-versions.js │   ...

  6. CSS3特效----制作立体导航栏菜单

    使用CSS3实现下图的导航菜单效果 <!doctype html> <html lang="en"> <head> <meta chars ...

  7. jquery与js实现全选功能的区别---2017-05-12

    一.jquery常用的事件 click(),dbclick() focus(),blur() change() keydown(),keypress(),keyup() mousedown(),mou ...

  8. 用react系列技术栈实现的demo整合系统

    引子 学生时代为了掌握某个知识点会不断地做习题,做总结,步入岗位之后何尝不是一样呢?做业务就如同做习题,如果‘课后’适当地进行总结,必然更快地提升自己的水平. 由于公司采用的react+node的技术 ...

  9. linux c++爬虫(一)

    int main(int argc, void *argv[]) { ]; ; char ch; ) { switch(ch) { case 'v': version(); break; case ' ...

  10. 分享一个完整的Mybatis分页解决方案

    Mybatis 的物理分页是应用中的一个难点,特别是配合检索和排序功能叠加时更是如此. 我在最近的项目中开发了这个通用分页器,过程中参考了站内不少好文章,阅读源码帮助更大minglisoft.cn/t ...