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