在DBAccess中关联两个对象

时间:2015-04-16 10:31:46

标签: ios objective-c 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个成员而不是如何将所有组成员和组详细信息存储在一个对象中以及如何检索它们? Thanx in adv。

1 个答案:

答案 0 :(得分:2)

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

这个问题源于在Objective-c中没有类型数组这样的事实。有了,我们将着眼于重新实现界面的工作方式。

我已将Group对象移动到成员中,因为成员属于某个组,然后将一个成员方法添加到Group对象以向后查看子对象。

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

希望这有帮助, 阿德里安