使用 Objective-C 领域中的多对多关系

Many-to-Many Relationships in Realm using Objective-C

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

Many Realm 中的关系是用 RLMArray 建模的。然而,每个一对一和对多关系都会创建自己对应的反向关系,该关系由 RLMLinkingObjects 建模(linking 到当前对象的对象)。

所以 RLMArray 是多对象的单向 link,RLMLinkingObjects 是 link 对象的单向逆 link物体。可以通过RLMArray修改关系,它会自动管理其逆关系(对应RLMLinkingObjects)。

如果您需要修改与目标的关系,那么您可以通过主键使用 link 查询跨 linking 个对象来查找具有 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 here 中阅读更多关于关系的信息。