使用 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 中阅读更多关于关系的信息。
我花了好几个小时试图找出如何使用 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 中阅读更多关于关系的信息。