以编程方式更新Core Data中的属性

时间:2009-01-10 21:23:44

标签: objective-c cocoa core-data object

我查看了Core Data的所有类文档,但我无法通过编程方式更新核心数据实体中的值。例如,我有一个类似于此的结构:

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

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

5 个答案:

答案 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();
        }

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