我查看了Core Data的所有类文档,但我无法通过编程方式更新核心数据实体中的值。例如,我有一个类似于此的结构:
id | title
============
1 | Foo
2 | Bar
3 | FooFoo
假设我想将Bar更新为BarBar,我在任何文档中都找不到任何方法。
答案 0 :(得分:43)
在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
}
答案 1 :(得分:24)
Apple documentation on using managed objects in 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 :(得分:8)
听起来你正在考虑底层关系数据库。 Core Data的API围绕模型对象而不是关系数据库构建。
实体是Cocoa对象 - NSManagedObject
的实例或其中的某个子类。实体的属性是对象的属性。您可以使用键值编码,或者,如果实现子类,则使用点语法或访问器方法来设置这些属性。
Evan DiBiase的回答显示了一种设置属性的正确方法 - 特别是访问者消息。这是点语法:
bookTwo.title = @"BarBar";
和KVC(您可以使用普通的旧NSManagedObject
):
[bookTwo setValue:@"BarBar" forKey:@"title"];
答案 3 :(得分:6)
如果我正确理解你的问题,我认为你需要记住的是托管对象与任何其他Cocoa类没有什么不同。属性具有可以在代码中使用的访问器和更改器,通过键值编码或通过绑定,只有在这种情况下它们由Core Data生成。唯一的技巧是如果你想避免使用setValue,你需要在你的类文件(如果有的话)中手动声明生成的访问器:ForKey:。文档更详细地描述了这一点,但简短的回答是您可以在数据模型设计器中选择属性,然后从“设计”菜单中选择复制Obj-C 2.0方法声明。
答案 4 :(得分:2)
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();
}
我认为这段代码会给你一个想法;)