Как управлять отношениями «один ко многим» в Core Data? - PullRequest
3 голосов
/ 04 января 2012

Мне трудно понять, как Core Data обрабатывает свою базу данных. Я объясню мои проблемы на конкретном примере:

Давайте просто скажем, что у нас есть следующая схема, где есть отделы, которые ведут многочисленные учетные записи (наши адреса).

Я создал файл основных данных с помощью редактора. В классе CachedDepartment я добавил необходимые атрибуты и создал отношение «ко многим», и я выбрал «Inverse» для «свойства Department моего CachedAccount. CacheAccount также имеет атрибуты и отношение, обратное к» адреса "отношения CachedDepartment.

У меня есть следующие источники (я даю вам 2 заголовочных файла. Остальные не содержат ничего интересного):

@interface CachedAccount : NSManagedObject {
@private
}
@property (nonatomic, retain) NSNumber * accountID;
@property (nonatomic, retain) NSString * email;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) CachedDepartment *department;
@end

@class CachedAccount;

@interface CachedDepartment : NSManagedObject {
@private
}
@property (nonatomic, retain) NSString * departmentID;
@property (nonatomic, retain) NSString * departmentName;
@property (nonatomic, retain) NSSet *addresses;
@end

@interface CachedDepartment (CoreDataGeneratedAccessors)

- (void)addAddressesObject:(CachedAccount *)value;
- (void)removeAddressesObject:(CachedAccount *)value;
- (void)addAddresses:(NSSet *)values;
- (void)removeAddresses:(NSSet *)values;

@end

А теперь вопросы:
- Как создать учетную запись и объекты отделов, чтобы установить отношение один-ко-многим?

- Что мне делать с CoreDataGeneratedAccessors? После создания я должен вызвать функцию -addAddressesObject CachedDepartment или мне нужно будет сделать что-то вроде anAccount.department = aDepartment и все?

- В каждом случае при создании объектов я могу быть уверен, что добавление адреса в отдел не создаст двойной экземпляр адреса и не сохранит его?

Буду признателен за любые идеи по этому поводу.

EDIT:

Если вставка новых объектов для сущности CachedDepartment будет выглядеть следующим образом:

NSManagedObject *cachedDepartment= [NSEntityDescription
    insertNewObjectForEntityForName:@"CachedDepartment" 
    inManagedObjectContext:[self managedObjectContext]];
/*
set values for failedBankInfo here
*/
NSError *error;
if (![context save:&error]) {
    NSLog(@"The following error occured: %@", [error localizedDescription]);
}

тогда добавление новой записи для cachedAccounts, которая будет иметь отношение один ко многим с вновь вставленным объектом cachedDepartment, будет примерно таким:

NSManagedObject *cachedAccounts = [NSEntityDescription
    insertNewObjectForEntityForName:@"CachedAccounts" 
    inManagedObjectContext:[<b>cachedDepartment managedObjectContext</b>]];
    /*
    set values for failedBankInfo here
    */
//setting the one-to-many relationship
[cachedDepartment addCachedAccountObject:cachedAccount];
[cachedAccount setCachedDepartment:cachedDepartment];
//
NSError *error;
if (![context save:&error]) {
    NSLog(@" couldn't save: %@", [error localizedDescription]);

1 Ответ

4 голосов
/ 04 января 2012

Как создать учетную запись и объекты отдела, чтобы установить отношение один-ко-многим?

Базовые данные автоматически заполнят для вас обратную связь, если у вас естьнастроил это в модели.Таким образом, в зависимости от того, как вы структурируете свой код, вы можете просто поставить newAccount.department = aDepartment;, и ваши отношения и обратное будут созданы.

Что мне делать с CoreDataGeneratedAccessors? После создания я должен вызвать функцию -addAddressesObject CachedDepartment или мне нужно будет сделать что-то вроде anAccount.department = aDepartment и все?

Да, это так.Смотрите предыдущий дополнительный ответ.Сгенерированные средства доступа создаются в том случае, если поток вашей программы делает более разумным работать наоборот, или если вы не определили обратные отношения.

Вы можете сделать

[aDepartment addAddressesObject:anAccount];

вместо

anAccount.department = aDepartment;

, но вам не нужно делать и то и другое.

В каждомВ случае, когда при создании объектов я могу убедиться, что добавление адреса в отдел не приведет к созданию двойного экземпляра адреса и его сохранению?

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

...