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