Я просмотрел всю документацию по классам для Core Data и не могу найти возможности программного обновления значений в сущности основных данных. Например, у меня есть структура, подобная этой:
id | title
============
1 | Foo
2 | Bar
3 | FooFoo
Скажем, я хочу обновить Bar до BarBar, я не могу найти способ сделать это ни в одной документации.





Документация Apple по использованию управляемых объектов в Core Data, вероятно, знает ваш ответ. Короче говоря, вы должны уметь делать что-то вроде этого:
NSError *saveError;
[bookTwo setTitle:@"BarBar"];
if (![managedObjectContext save:&saveError]) {
NSLog(@"Saving changes to book book two failed: %@", saveError);
} else {
// The changes to bookTwo have been persisted.
}
(Примечание: bookTwo должен быть управляемым объектом, связанным с managedObjectContext, чтобы этот пример работал.)
Похоже, вы думаете о базовой реляционной базе данных. API Core Data построен на объектах модели, а не на реляционных базах данных.
Сущность - это объект Какао - экземпляр NSManagedObject или некоторого его подкласса. Атрибуты сущности - это свойства объекта. Вы используете кодирование «ключ-значение» или, если вы реализуете подкласс, точечный синтаксис или методы доступа для установки этих свойств.
Ответ Эвана ДиБиасе показывает один правильный способ установки свойства - в частности, сообщение доступа. Вот синтаксис точки:
bookTwo.title = @"BarBar";
И KVC (который можно использовать со старым добрым NSManagedObject):
[bookTwo setValue:@"BarBar" forKey:@"title"];
Если я правильно понимаю ваш вопрос, я думаю, что все, что вам нужно иметь в виду, это то, что управляемые объекты действительно ничем не отличаются от любого другого класса Какао. Атрибуты имеют аксессоры и мутаторы, которые вы можете использовать в коде, посредством кодирования значения ключа или через привязки, только в этом случае они генерируются Core Data. Единственный трюк заключается в том, что вам нужно вручную объявить сгенерированные аксессоры в вашем файле класса (если он у вас есть) для вашей сущности, если вы не хотите использовать setValue: ForKey :. В документации это описано более подробно, но краткий ответ заключается в том, что вы можете выбрать свои атрибуты в конструкторе модели данных и выбрать Копирование объявлений методов Obj-C 2.0 в меню «Дизайн».
В Core Data объект - это объект, это объект, а база данных - это не то, на что вы отправляете команды.
Чтобы обновить то, что сохраняется, вы воссоздаете это как объект, обновляете и сохраняете.
NSError *error = nil;
//This is your NSManagedObject subclass
Books * aBook = nil;
//Set up to get the thing you want to update
NSFetchRequest * request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"MyLibrary" inManagedObjectContext:context]];
[request setPredicate:[NSPredicate predicateWithFormat:@"Title=%@",@"Bar"]];
//Ask for it
aBook = [[context executeFetchRequest:request error:&error] lastObject];
[request release];
if (error) {
//Handle any errors
}
if (!aBook) {
//Nothing there to update
}
//Update the object
aBook.Title = @"BarBar";
//Save it
error = nil;
if (![context save:&error]) {
//Handle any error with the saving of the context
}
Не совсем. Если вы позволите XCode настроить проект Core Data в последних выпусках, код шаблона включает некоторые вызовы метода сохранения контекста управляемого объекта в местах «последнего шанса», например applicationWillTerminate в делегате приложения, но это, вероятно, менее надежно. чем требуется большинству приложений. Призывы к сохранению обходятся дорого - приведенный здесь пример после очень незначительного изменения сделан для полноты картины.
NSManagedObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
NSArray *temp = [[NSArray alloc]initWithObjects:@"NewWord", nil];
[object setValue:[temp objectAtIndex:0] forKey:@"title"];
// Save the context.
NSError *error = nil;
if (![context save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
Думаю, этот фрагмент кода даст вам представление;)
Основные данные сохраняются автоматически? Вы можете вызвать save, если хотите принудительно, но он должен автоматически сохранять AFAIK.