1

我花了好几个小时试图弄清楚如何设置对象关系的模型并使用 Objective-C 在 Realm 中创建/删除多对多关系。文档帮助不大。我可以使用一些关于是否使用 RLMArray 或 RLMLinkingObjects 的指导...如果我使用 RLMLinkingObjects 来设置我的多对多关系,我不能使用addObject:创建关系,我找不到删除关系的任何方法。我正在从 Core Data 关系数据库迁移,并且有几个我正在尝试建模的多对多关系,这对我来说根本没有意义。唯一显示多对多关系的文档显示了一个与它自己的两个属性相关的类。其中一个属性使用 RLMArray,另一个使用 RLMLinkingObjects。这对我来说毫无意义,因为多对多关系应该是双向的,并且应该能够通过任一方添加或删除关系。也许我想错了,但我迷路了,希望能得到一些帮助。

4

1 回答 1

2

ManyRealm 中的关系用RLMArray. 然而,每个一对一和一对多关系都会创建其自己的对应逆向关系,该逆向关系由RLMLinkingObjects(链接到当前对象的对象)建模。

RLMArray指向多个对象的单向链接也是如此,并且RLMLinkingObjects是指向链接到该对象的对象的单向反向链接。可以通过 修改关系RLMArray,它会自动管理其逆向关系(对应的RLMLinkingObjects)。

如果您需要修改来自目标的关系,那么您可以RLMArray通过主键在链接对象中使用链接查询来查找对象。

import <Realm/Realm.h>

@class Person;

// Dog model
@interface Dog : RLMObject
@property NSInteger id;
@property NSString *name;
@property (readonly) RLMLinkingObjects *owners;
@end
RLM_ARRAY_TYPE(Dog) // define RLMArray<Dog>

// Person model
@interface Person : RLMObject
@property NSInteger            id;
@property NSString             *name;
@property NSDate               *birthdate;
@property RLMArray<Dog *><Dog> *dogs;
@end
RLM_ARRAY_TYPE(Person) // define RLMArray<Person>

// Implementations
@implementation Dog
+ (NSDictionary *)linkingObjectsProperties {
    return @{
        @"owners": [RLMPropertyDescriptor descriptorWithClass:Person.class propertyName:@"dogs"],
    };
}

+ (NSString *)primaryKey {
    return @"id";
}

+ (NSArray *)indexedProperties {
  return @[@"name"];
}
@end

@implementation Person
+ (NSString *)primaryKey {
    return @"id";
}

+ (NSArray *)indexedProperties {
  return @[@"name"];
}
@end

所以当你person.dogs在一个事务中修改,那么dog.owners就会自动更新。

RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock:^{
    Person *jim = [[Person objectsWhere:@"name == 'Jim'"] firstObject];
    // Jim is owner of Rex 
    Dog * rex = [[Dog objectsWhere:@"name == 'Rex'"] firstObject];
    [jim.dogs addObject:rex]; // <-- now rex's `owners` contains `jim`
}];

您可以在此处阅读有关 Realm 中关系的更多信息。

于 2017-06-14T00:17:52.153 回答