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

时间:2017-06-13 23:55:05

标签: objective-c many-to-many realm rlmarray rlmlinkingobjects

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

1 个答案:

答案 0 :(得分:2)

Realm中的

Many关系使用RLMArray建模。然而,每个to-one和to-many关系都会创建自己的对应关系,它由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` }]; 将自动更新。

word-break: break-all

您可以在Realm here中详细了解关系。