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

mac*_*osh 19 cocoa core-data object objective-c

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

 id  | title
============
  1  | Foo  
  2  | Bar  
  3  | FooFoo
Run Code Online (Sandbox Code Playgroud)

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

gif*_*iff 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
}
Run Code Online (Sandbox Code Playgroud)


Eva*_*ase 24

关于在Core Data中使用托管对象Apple文档可能有您的答案.简而言之,您应该能够做到这样的事情:

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.
}
Run Code Online (Sandbox Code Playgroud)

(注意:bookTwo必须是与managedObjectContext此示例关联的托管对象才能工作.)


Pet*_*sey 8

听起来你正在考虑底层关系数据库.Core Data的API是围绕模型对象而不是关系数据库构建的.

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

Evan DiBiase的答案显示了一种正确的方法来设置属性 - 特别是访问者消息.这是点语法:

bookTwo.title = @"BarBar";
Run Code Online (Sandbox Code Playgroud)

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

[bookTwo setValue:@"BarBar" forKey:@"title"];
Run Code Online (Sandbox Code Playgroud)


Mar*_*eau 6

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