Программно обновить атрибут в основных данных
Я просмотрел всю документацию классов для Core Data, и я не могу найти программное обновление значений в основном объекте данных. Например, у меня есть структура, подобная этой:
id | title
============
1 | Foo
2 | Bar
3 | FooFoo
Скажите, что я хочу обновить Bar до BarBar, я не могу найти способ сделать это в любой документации.
Ответы
Ответ 1
Документация 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
, чтобы этот пример работал.)
Ответ 2
В 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
}
Ответ 3
Похоже, вы думаете о базовой реляционной базе данных. Core Data API построен вокруг объектов модели, а не реляционных баз данных.
Сущность - это объект Cocoa - экземпляр NSManagedObject
или некоторый подкласс этого. Атрибуты объекта - это свойства объекта. Вы используете кодирование с ключом или, если вы применяете подкласс, точечный синтаксис или методы доступа, чтобы установить эти свойства.
Ответ Evan DiBiase показывает один правильный способ установки свойства - в частности, сообщения о доступе. Здесь синтаксис точки:
bookTwo.title = @"BarBar";
И KVC (который вы можете использовать с простым старым NSManagedObject
):
[bookTwo setValue:@"BarBar" forKey:@"title"];
Ответ 4
Если я правильно понимаю ваш вопрос, я думаю, что все, что вам нужно иметь в виду, - это управляемые объекты, которые ничем не отличаются от любого другого класса Cocoa. Атрибуты имеют аксессуар и мутаторы, которые вы можете использовать в коде, с помощью кодирования ключевых значений или посредством привязок, только в этом случае они генерируются Core Data. Единственный трюк - вам нужно вручную объявить сгенерированные аксессоры в вашем файле класса (если есть) для вашего объекта, если вы хотите избежать использования setValue: ForKey:. Документация описывает это более подробно, но короткий ответ заключается в том, что вы можете выбрать свои атрибуты в дизайнере модели данных и выбрать Копировать Obj-C 2.0 декларации методов из меню "Дизайн".
Ответ 5
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();
}
Я думаю, что этот фрагмент кода даст вам идею;)