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