在 DBAccess 中关联两个对象
Relating two objects in DBAccess
我正在为我的 iOS 项目使用 dbaccess。
如何将数组传递给 dbaccess 对象?例如:
我有像这样的 dbobject:
@interface Member : DBObject
@property (strong) NSString* firstname;
@property (strong) NSString* lastName;
@end
@interface Group : DBObject
@property (strong) NSString* groupName;
@property (strong) NSString* adminName;
@property (strong) Member* members;
@end
对于这个组,它有 4 个成员,如何将所有组成员和组详细信息存储在一个对象中以及如何检索它们?
进阶感谢
为了回答这个问题,我重新建模并在下面提供了一个示例,说明您将如何在这两个对象之间创建一对一关系。
这个问题源于Objective-c中没有类型化数组这样的东西。如果有,我们将着眼于重新实现接口的工作方式。
我把Group对象移到了member中,因为一个成员属于一个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;
此外,当您将组对象添加到成员中时:
@property (strong) Group* group;
DBAccess 自动在 SQLite 中为 group 属性 创建了一个索引,并优先考虑其在缓存中的重要性,因为以这种方式链接的对象更有可能被访问。
希望这对您有所帮助,
阿德里安
我正在为我的 iOS 项目使用 dbaccess。 如何将数组传递给 dbaccess 对象?例如: 我有像这样的 dbobject:
@interface Member : DBObject
@property (strong) NSString* firstname;
@property (strong) NSString* lastName;
@end
@interface Group : DBObject
@property (strong) NSString* groupName;
@property (strong) NSString* adminName;
@property (strong) Member* members;
@end
对于这个组,它有 4 个成员,如何将所有组成员和组详细信息存储在一个对象中以及如何检索它们? 进阶感谢
为了回答这个问题,我重新建模并在下面提供了一个示例,说明您将如何在这两个对象之间创建一对一关系。
这个问题源于Objective-c中没有类型化数组这样的东西。如果有,我们将着眼于重新实现接口的工作方式。
我把Group对象移到了member中,因为一个成员属于一个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;
此外,当您将组对象添加到成员中时:
@property (strong) Group* group;
DBAccess 自动在 SQLite 中为 group 属性 创建了一个索引,并优先考虑其在缓存中的重要性,因为以这种方式链接的对象更有可能被访问。
希望这对您有所帮助, 阿德里安