Связывание двух объектов в DBAccess

Я использую dbaccess для своего проекта iOS. Как я могу передать массив объекту 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 члена, чем Как я могу хранить всех членов группы и детали группы в одном объекте, а также как их получить? Спасибо в Adv.

1 ответ

Решение

Чтобы ответить на вопрос, я смоделировал и привел ниже пример того, как вы будете создавать отношения один к одному между этими двумя объектами.

Эта проблема связана с тем, что в Objective-c нет такого понятия, как типизированный массив. Когда это произойдет, мы рассмотрим повторную реализацию того, как работает интерфейс.

Я переместил объект Group в член, так как член принадлежит группе, а затем добавил метод members к объекту 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 для свойства группы и расставил приоритеты его важности в кеше, так как объекты, связанные таким образом, с большей вероятностью будут доступны.

Надеюсь, это поможет, Адриан

Другие вопросы по тегам