3

我正在为我的 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 个成员,而不是我如何将所有组成员和组详细信息存储在一个对象中以及如何检索它们?谢谢你。

4

1 回答 1

2

为了回答这个问题,我重新建模并在下面提供了一个示例,说明如何在这两个对象之间创建一对一的关系。

这个问题源于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属性创建一个索引,并优先考虑它在缓存中的重要性,因为以这种方式链接的对象更有可能被访问。

希望这会有所帮助,阿德里安

于 2015-04-16T11:42:16.307 回答