Копирование основного объекта данных - PullRequest
2 голосов
/ 30 декабря 2011

У меня есть подкласс в NSManagedObject, скажем, Business.У меня есть некоторые предприятия, хранящиеся в основных данных.Теперь я выбираю все предприятия из Core Data по

 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
 NSEntityDescription *entity = [NSEntityDescription  entityForName:@"Business" inManagedObjectContext:[Model sharedInstance].managedObjectContext];
 [fetchRequest setEntity:entity];

 NSError* error = nil;
 NSMutableArray * businesses = (NSMutableArray*)[self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
 [fetchRequest release];

. Если я хочу получить копию какого-либо одного бизнес-объекта, я делаю:

Business *tempBusiness = [[businesses objectAtIndex:0] mutableCopy];

На этом этапевыдается ошибка «[Business copyWithZone] нераспознанный селектор»

Почему я получаю эту ошибку.Или есть ли способ создать изменяемую копию объекта Core Data?

1 Ответ

3 голосов
/ 30 декабря 2011

First Core Data не имеет понятия изменчивых и неизменных объектов. Вы всегда можете изменить объект (в пределах ограничений модели данных).

Во-вторых, мы должны различать в памяти копию и копию в базе данных . Копия в памяти, по существу, будет делать memncpy байтов от адреса памяти A до адреса памяти B. Это, по сути, то, что copy и mutableCopy предоставляют нам в Objective-C. Копия в базе данных создаст копию существующей строки. Важное различие между этими типами копий заключается в том, что первый не создает дубликат в базе данных.

Короче говоря, вы не можете делать в памяти копии NSManagedObjects. NSManagedObject (в данном случае Business) - это строка в базе данных. В результате, если copy и mutableCopy работают на NSManagedObjects, это создаст несколько объектов, ссылающихся на одну и ту же строку в базе данных из одного и того же NSManagedObjectContext. Это не имеет большого смысла и создаст больше проблем, чем решит. Например, если у вас было две копии NSManagedObject, и вы изменили имя на @"Bar" для первого и @"Foo" для второго. А затем позвоните save на ваш NSManagedObjectContext, значение которого будет записано @"Foo" или @"Bar"?

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

...