前言:本篇博客将介绍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. 04(2) 基于上下文相关的GMM-HMM声学模型2之参数共享

    1.三音素建模存在的问题 问题一:很多三音素在训练数据中没有出现(尤其跨词三音素) 问题二:在训练数据中出现过的三音素有相当一部分出现的频次较少 因此,三音素模型训练时存在较严重的数据不足问题 2.参 ...

  2. 搭建本地git仓库

    使用工具:git|码云 步骤: 注册码云账号,创建项目名称等. 本地git配置 本地文件目录:git init(初始化创建分支master) 基础配置:git config --global user ...

  3. 谷歌统计使用代码部署和事件API使用

    谷歌统计代码部署和API使用 1.注册谷歌账号 要使用GA,必需先成为GOOGLE的注册用户,如果没有请去注册.当然,你有GMAIL邮箱就可以.邮箱就是帐户名. 2.开启Google Analytic ...

  4. Docker - 定制镜像

    Dockerfile Docker Hub拥有大量高质的官方镜像:可直接使用的服务类镜像.语言应用镜像.基础操作系统镜像等,满足绝大部分需求. 此外,可以通过定制镜像的方式来满足实际使用中的特定需求. ...

  5. aync await 进一步探索

    aync await 进一步探索 首先来个例子 class Program { static int index = 1; static void Log(string str) { Console. ...

  6. 深入理解Java常用类----String

         Java中字符串的操作可谓是最常见的操作了,String这个类它封装了有关字符串操作的大部分方法,从构建一个字符串对象到对字符串的各种操作都封装在该类中,本篇我们通过阅读String类的源码 ...

  7. 添加Metasploit-payload到已有的Android项目中

    metasploit在写这篇文章之前,笔者可以说是对java一窍不通,也从来没有写过什么Android应用,在几天的摸爬滚打中终于实现了最终的目的,就是在已有Apk源码的情况下,用了比较另类的方式,添 ...

  8. C/s从文件(TXT)中读取数据插入数据库

    流程: 1.当按钮单击时,弹出OpenFileDialog 2.判断后缀名是否合法 3.导入数据库 按钮事件中的代码: 1.判断用户是否选中文件. 2.判断用户选择的文件是否为txt //第一步,当按 ...

  9. dubbo在企业中用得多吗?

    看了阿里的dubbo,据说是一个不错的服务框架, 不过,好像Minglisoft.technology搞研发希望各位可以指点学习 想知道其他的公司用这个框架多吗?遇到的问题能否快速解决呢?抉择中...

  10. php实现题目抢答、商品秒杀等类型的需求

    最近和其他部门合作项目,当然我是负责php接口方面的工作,get到一些东西,所以来分享记录一下. 项目需求: 题目将通过主持人ipad投射至大屏幕,选手按'抢答'按钮进行抢答.抢答成功,选手所在组,以 ...