Мне сложно разобраться в том, как 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]);
Большое спасибо! Еще одна вещь, о которой я спрашиваю, это использование управляемого объекта управления (check EDIT в моем Вопросе). Как вы видите, я использую [cachedDepartment managedObjectContext]. – 32l3n
Это будет одно и то же: в вашем приложении будет только один контекст управляемых объектов (у вас может быть больше, но я сомневаюсь, что вы это делаете на этом этапе!), Поэтому использование одного из объекта отдела является прекрасным, или одно из себя также отлично, если вы находитесь в одном и том же объекте. – jrturton