为了回答这个问题,我重新建模并在下面提供了一个示例,说明如何在这两个对象之间创建一对一的关系。
这个问题源于Objective-c中没有类型数组这样的东西。如果有,我们将研究重新实现接口的工作方式。
我已将 Group 对象移动到成员中,因为成员属于一个组,然后向 Group 对象添加了一个 members 方法以向后查看子对象。
@interface Member : DBObject
@property (strong) NSString* firstname;
@property (strong) NSString* lastName;
@property (strong) Group* group;
@end
@interface Group : DBObject
@property (strong) NSString* groupName;
@property (strong) NSString* adminName;
- (DBResultSet*)members;
@end
现在的实现看起来像这样。
@implementation Member
@dynamic firstname,lastName, group;
@end
@implementation Group
@dynamic adminName, groupName;
- (DBResultSet *)members {
/* we achieve one-to-many relationships by querying the objects in the
manner a relational database would commonly be structured */
return [[[Member query] whereWithFormat:@"group = %@", self] fetch];
}
- (void)entityDidDelete {
/* when you create tight bonds, you may well wish to create 'trigger' methods
to clean data and keep the integrity in good order */
for (Member* member in [[[Member query] whereWithFormat:@"group = %@", self] fetch]) {
member.group = nil;
[member commit];
}
}
@end
现在没有什么能阻止您将数组创建为属性类型,并将 Id 值存储在其中。但这不是很干净,需要您维护它,而如果您正在寻找 FK 值,则不需要维护,您可以创建可爱的逻辑来停止删除与其他对象相关的对象,而无需水合很多对象,然后查看数组内部。
此外,您还可以使用对象点符号来导航来自 Person 对象的强类型关系。
NSString* admin = person.group.adminName;
此外,当您将 Group 对象添加到 Member 时:
@property (strong) Group* group;
DBAccess 自动在 SQLite 中为group属性创建一个索引,并优先考虑它在缓存中的重要性,因为以这种方式链接的对象更有可能被访问。
希望这会有所帮助,阿德里安