Realm的一对多配置以及版本兼容
前言:本篇博客将介绍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的一对多配置以及版本兼容的更多相关文章
- APP接口版本兼容的问题
现在基本每个公司都做APP,所以大家都面临 APP接口版本兼容的问题. iOS和android 要不断开发新版本,很多服务端开发都是在以前接口的逻辑上进行修改.新的APP和接口开发后,接口如何兼容老的 ...
- Microsoft ReportViewer 控件类型版本兼容问题及解决方法
错误 Parser Error Message: The base class includes the field 'rvEquipment', but its type (Microsoft.Re ...
- 模块XXXX可能与您正在运行的Windows版本不兼容。检查该模块是否与regsvr32.exe的x86(32位)x64(64位)版本兼容。
最近自己在编写ActiveX控件.遇到的麻烦事不少. 今天遇到了这个问题“模块XXXX可能与您正在运行的Windows版本不兼容.检查该模块是否与regsvr32.exe的x86(32位)x64(64 ...
- 我的Android进阶之旅------>Android中高低API版本兼容使用@TargetApi或者@SuppressLint("NewApi")
Android中高低API版本兼容使用@TargetApi或者@SuppressLint("NewApi") 例如:AndroidManifest.xml中,我们配置了sdk版本的 ...
- Java SE 9 多版本兼容 JAR 包示例
Java SE 9 多版本兼容 JAR 包示例 作者:Grey 原文地址:Java SE 9 多版本兼容 JAR 包示例 说明 Java 9 版本中增强了Jar 包多版本字节码文件格式支持,也就是说在 ...
- RoseRT配置高版本的编译器
RoseRT配置高版本的VC++ ,我有VC++2008 Express ,实习时下载滴! 感谢Google,感谢大神地指导!困扰的问题终于解决,豁然开朗,so开始吧! 第一大步:重中之重, 确保nm ...
- 您的项目引用了最新实体框架;但是,找不到数据链接所需的与版本兼容的实体框架数据库 EF6使用Mysql的技巧
转载至: http://www.cnblogs.com/Imaigne/p/4153397.html 您的项目引用了最新实体框架:但是,找不到数据链接所需的与版本兼容的实体框架数据库 EF6使用Mys ...
- ibatis mybatis sql语句配置 符号不兼容 大于号 小于号<!CDATA[ ]>
ibatis mybatis sql语句配置 符号不兼容 大于号 小于号<!CDATA[ ]> 因为这个是xml格式的,所以不允许出现类似">"这样的字符,但是都 ...
- MAC下 JDK环境配置、版本切换以及ADB环境配置
网上方法,自己总结:亲测可行! 一.JDK环境配置.版本切换: 通过命令’jdk6′, ‘jdk7′,’jdk8’轻松切换到对应的Java版本: 1.首先安装所有的JDk:* Mac自带了的JDK6, ...
随机推荐
- 蓝桥杯-骰子游戏-java
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...
- Stimulsoft报表操作笔记(一):统计
一.引言 报表大家应该都知道是什么,简单来说就是用表格.图表等格式来动态显示数据.现在web系统中很多需要使用到报表统计.打印功能等,将所需用到的数据绑定到指定的位置,然后分类汇总,这样查看起来更清晰 ...
- 纯css实现翻牌特效
大家有没有看到过网上很炫的翻牌效果,牌正面对着我们,然后点击一下,牌就被翻过来了,效果很酷炫,是不是很想知道是怎么实现的么,代码很简单,跟着小编往下走. 先给大家介绍一下翻牌的原理: 1.父容器设置设 ...
- 被低估的选手 - JavaFx
被低估的选手 - JavaFx 1.MFC(Visual C++) 个人不是很喜欢这个框架,太多系统定义的东西,就像无底洞,学都学不完,这个东西需要你有比较强的记忆力,并且能融会贯通里面很多预定义的功 ...
- 使用Dotfuscator加密混淆程序以及如何脱壳反编译
混淆演示 首先介绍如何使用Dotfuscator对.net程序加密码混淆/加壳 C#或vb.net编写的应用程序或DLL. 这里随便创建了一个C#的命令行控制台程序.程序很简单,对当前的时间进行了AE ...
- java环境安装之不能安装exe文件
经过多年,打算再学下java 从官网下载java8安装包,但因为我的计算机的cd-room被卸载掉了,安装是报错说cab文件损坏之类的错误. 从stackOverflow中找到一篇眼前一亮的解决办法. ...
- 通过DNS传输后门来绕过杀软
前言 在本篇文章里,我想解释怎么样不使用加密数据的方法也能绕过杀软,同时我也想在github上分享源代码.https://github.com/DamonMohammadbagher/NativePa ...
- maven私服nexus搭建(windows)
1.下载nexus 地址:https://www.sonatype.com/download-oss-sonatype 下载相应版本的zip包. 2.安装nexus 下载完成后,解压到本地任意目录. ...
- 【2017-05-22】WebForm内置对象:Application和ViewState、Repeater的Command用法
一.内置对象 1.Application 存贮在服务器端,占用服务器内存生命周期:永久 所有人访问的都是这一个对象 传值:传的是object类型可以传对象. string s =TextBox1.Te ...
- Memcached和Redis简介
前言: 目前比较流行的缓存技术无疑是Memcached和Redis,两套缓存技术有着诸多的相似之处,但又具备大量的显著差异,作为新生的方案,Redis被视为首选,但是有些场景Memcached发挥的作 ...