19

我查看了 Core Data 的所有类文档,但找不到以编程方式更新核心数据实体中的值的方法。例如,我有一个类似这样的结构:

 id  | title
============
  1  | Foo  
  2  | Bar  
  3  | FooFoo

假设我想将 Bar 更新为 BarBar,我在任何文档中都找不到任何方法来执行此操作。

4

5 回答 5

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
}
于 2011-07-13T19:59:41.520 回答
24

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此示例相关联的托管对象才能工作。)

于 2009-01-10T22:12:10.117 回答
8

听起来您正在考虑基础关系数据库。Core Data 的 API 是围绕模型对象构建的,而不是关系数据库。

实体是一个 Cocoa 对象——它的一个实例NSManagedObject或某个子类。实体的属性是对象的属性。您使用键值编码,或者,如果您实现子类,则使用点语法或访问器方法来设置这些属性。

Evan DiBiase 的回答显示了设置属性的一种正确方法——特别是访问器消息。这是点语法:

bookTwo.title = @"BarBar";

和 KVC(你可以使用普通的 old NSManagedObject):

[bookTwo setValue:@"BarBar" forKey:@"title"];
于 2009-01-11T01:08:13.973 回答
6

如果我正确理解您的问题,我认为您需要记住的只是托管对象与任何其他 Cocoa 类实际上没有什么不同。属性有访问器和修改器,你可以在代码中使用,通过键值编码或绑定,只有在这种情况下它们是由 Core Data 生成的。唯一的技巧是,如果您想避免使用 setValue:ForKey:,则需要在类文件(如果有的话)中为您的实体手动声明生成的访问器。文档对此进行了更详细的描述,但简短的回答是您可以在数据模型设计器中选择您的属性,然后从“设计”菜单中选择“复制 Obj-C 2.0 方法声明” 。

于 2009-01-11T01:10:28.430 回答
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();
        }

我认为这段代码会给你这个想法;)

于 2013-07-26T02:30:42.407 回答