3

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

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

Я создал файл основных данных с помощью редактора. В классе CachedDepartment я добавил необходимые атрибуты, и я создал отношение «ко многим», и я выбрал «Обратный» для свойства «Департамент» моего 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]); 

ответ

4

Как должен n объектов аккаунта и отдела, чтобы установить связь «один ко многим»?

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

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

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

Вы могли бы сделать

[aDepartment addAddressesObject:anAccount]; 

вместо

anAccount.department = aDepartment; 

, но вы не должны делать оба.

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

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

+0

Большое спасибо! Еще одна вещь, о которой я спрашиваю, это использование управляемого объекта управления (check EDIT в моем Вопросе). Как вы видите, я использую [cachedDepartment managedObjectContext]. – 32l3n

+0

Это будет одно и то же: в вашем приложении будет только один контекст управляемых объектов (у вас может быть больше, но я сомневаюсь, что вы это делаете на этом этапе!), Поэтому использование одного из объекта отдела является прекрасным, или одно из себя также отлично, если вы находитесь в одном и том же объекте. – jrturton