Realm的一對多配置以及版本兼容

前言:本篇博客將介紹Realm的一些高級用法,基本使用在這裏html

1、配置一對多關係ui

 1 //
 2 //  Teacher.h
 3 
 4 #import <Realm/Realm.h>
 5 #import "Student.h"
 6 
 7 @interface Teacher : RLMObject
 8 
 9 @property NSInteger _ID;
10 @property NSString *name;
11 @property NSInteger age;
12 @property NSString *sex;
13 @property RLMArray<Student *><Student> *students;
14 
15 @end
 1 //  Student.h
 2 
 3 #import <Realm/Realm.h>
 4 
 5 @interface Student : RLMObject
 6 
 7 @property NSString *name;
 8 @property(readonly) RLMLinkingObjects *teacher;
 9 
10 @end
11 
12 RLM_ARRAY_TYPE(Student)

 

解析:一、假設如今Teacher爲一的這一端多便是指Student(PS:雖然一個學生也能夠對應多個老師,本例只是說明問題請勿糾結細節)spa

二、在多的這個屬性上用RLMArray修飾以前必須在多的這一端即Student中添加一個宏RLM_ARRAY_TYPEcode

插入數據htm

 1 RLMRealm *realm = [RLMRealm defaultRealm];
 2         [realm transactionWithBlock:^{
 3             Teacher *teacherWan = [[Teacher alloc]init];
 4             teacherWan._ID = _IDNumber;
 5             teacherWan.name = @"小明";
 6             teacherWan.age = 13;
 7             teacherWan.sex = @"male";
 8     
 9             Student *stu1 = [[Student alloc]init];
10             stu1.name = @"旺財";
11     
12             Student *stu2 = [[Student alloc]init];
13             stu2.name = @"來福";
14             [teacherWan.students addObject:stu1];
15             [teacherWan.students addObject:stu2];
16             [realm addObject:teacherWan];
17             
18             [realm commitWriteTransaction];
19 }];

查詢數據對象

2、反向連接blog

 1 //  Student.m
 2 
 3 #import "Student.h"
 4 #import "Teacher.h"
 5 
 6 @implementation Student
 7 
 8 //反向連接
 9 + (NSDictionary *)linkingObjectsProperties {
10     return @{
11              @"teacher": [RLMPropertyDescriptor descriptorWithClass:Teacher.class propertyName:@"students"],
12              };
13 }
14 
15 @end

解析:一、藉助連接對象屬性,您能夠經過指定的屬性來獲取全部連接到指定對象的對象。例如,一個 Teacher 對象能夠擁有一個名爲 students 的連接對象屬性,這個屬性中包含了某些 Student 對象,而這些 Student 對象在其 teacher 屬性中包含了這一個肯定的 Teacher 對象。您能夠將 teacher 屬性設置爲 RLMLinkingObjects 類型,而後重寫 +[RLMObject linkingObjectsProperties] 來指明關係,說明 student 中包含了 Teacher 模型對象。(引用官網解釋)ip

二、其實就是能夠經過一的這一端能夠知道多的有哪些,從多的這一端能夠知道與其關聯的一是什麼。(我的理解)get

3、版本兼容博客

PS: 一個應用不免要進行版本升級,而版本升級中每每須要將對原有對象的結構進行更改,多是刪除了一個表或者是在一張表中添加了一個字段又或者是把一個表的字段名更改了。當版本更新時,咱們又須要保留用戶在上一個版本中保存的一些信息,若是咱們不作版本兼容,那就意味着原有數據將會丟失。

一、在AppDelegate中添加如下代碼

 1 RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
 2     config.schemaVersion = 4;
 3     NSLog(@"%llu", config.schemaVersion);
 4     config.migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion) {
 5         if (oldSchemaVersion < 2){
 6             NSLog(@"-------%llu", oldSchemaVersion);
 7             [migration renamePropertyForClass:Person.className oldName:@"name" newName:@"nickName"];
 8         }
 9         
10         if (oldSchemaVersion < 3){
11             NSLog(@"-------%llu", oldSchemaVersion);
12             [migration deleteDataForClassName:@"Human"];
13         }
14         
15         if (oldSchemaVersion < 4){
16             NSLog(@"-------%llu", oldSchemaVersion);
17             [migration deleteDataForClassName:@"Cat"];
18         }
19     };
20     [RLMRealmConfiguration setDefaultConfiguration:config];
21     [RLMRealm defaultRealm];

解析:一、記錄數據倉庫的版本號config.schemaVersion 默認從0開始,每一次升級的number必須比上一次大

二、若是須要修改一個表的字段,只需先修改對應對象的屬性名,而後再在版本兼容中調用migration 的renamePropertyForClass方法

三、如需在一張表中添加或刪除一個字段,只須要在對應的對象中添加或刪除屬性便可,在應用啓動時會自動添加或刪除

四、如需添加一張表,也只須要建立一個新的RLMObject對象子類便可

五、如需刪除一張表,先將該對象刪除,而後同理在版本兼容中調用migration 的deleteDataForClassName方法

相關文章
相關標籤/搜索