将对象添加到NSArrayController并将其保存到实体中

时间:2013-03-11 16:30:07

标签: cocoa core-data nsarraycontroller

我有一个NSArrayController,它连接到Core Data中的Entity。我有一个IBOutlet附加到NSArrayController,以便我可以从我的Delegate添加对象。

我正在尝试使用一些预设向NSArrayController添加一个Object。到目前为止,我已经找到了如何使用。

添加对象
[cards add:sender];

这可以,但它会添加一个空白对象。当我退出应用程序时,它会将此对象保存到实体,这样当我再次希望它仍然存在时。

但是我也找到了一种方法来创建一个带有预设的新对象,但是如果像上一个方法一样,它就不会保存。

NSDictionary *addedObject = [NSDictionary dictionary];
addedObject = [NSDictionary dictionaryWithObjectsAndKeys:@"TITLE", @"title",
@"CONTENT", @"content", nil];
[cards addObject:addedObject];

有没有其他方法可以使用预设创建一个新对象但是也可以保存它?我是Core Data的新手,所以我不是百分之百的全部。也许有办法创建一个指向实际实体的指针并从那里编辑它?

3 个答案:

答案 0 :(得分:3)

子类NSArrayController并重新实现add函数,或者对您的实体进行子类化并重新实现awakeFromInsert。两者都是预设对象值的可接受位置。

在NSArrayController子类化的情况下:

@implementation CardsArrayController

-(void) add:(id)sender {
    NSManagedObject *newItem = [self newObject];
    //do object set up here...
    [self addObject:newItem];
}

@end

答案 1 :(得分:0)

无论您添加获取managedObjectContext引用的对象并保存上下文,都会保存对象。

如果您使用的是apple提供的样板代码,则可以使用以下代码:

NSError *error;
AppDelegate *appD = [NSApp delegate];
[appD.managedObjectContext save:&error];

或者你可以致电[appD saveAction:Nil]。这也会在保存上下文之前尝试进行编辑。

或者您可以将按钮连接到saveAction:(它是IBAction),以便在点击按钮时保存上下文。

编辑:此外,从阵列控制器创建的对象也不必为空。由你决定。您可以使用文本字段(或其他可编辑的ui元素)绑定到arrayController来执行此操作。或者,您可以获取数组的content属性来访问该对象,然后进行编辑。 或者你可以通过代码添加整个对象而根本不使用数组控制器。 有很多方法。

答案 2 :(得分:0)

再次,NSDictionary - 不是实体实例。实体在内存中表示为NSMangedObject(或其子类,但实际上不需要子类)的实例。

事实上,托管对象支持KVC,因此它们可以表现为某些事物的字典(setValue:forKey等),但相似性结束的地方。无法将NSDictionary插入到控制Core-Data实体的NSArrayController中。您必须使用Core-Data API

创建实体

e.g。

NSManagedObject *myNewEntiry = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.managedObjectContext];

如果以这种方式创建实体 - 使用NSArrayController使用的相同托管对象上下文 - 它将自动(但不是立即)添加到阵列控制器的内容中。

名为NSArrayController的{​​{1}} IBAction是一种便捷快捷方式,它确实创建了一个指定给-(void) add:(id)sender;的类型(和名称)的新实体,并将其添加到控制器内容中。但实际上 - 因为它没有收到任何参数 - 它会创建一个"空白"实体。空白表示 - 使用模型中定义的默认值。

本页的第一个答案,理所当然地建议您覆盖自己的NSArrayController子类中的add: IBAction,以便在将新实体插入{{1 }}'内容。

所以它看起来像:

NSArrayController

我希望这可以澄清一些内容,但是您需要阅读核心数据并浏览一些基于Core-Data应用程序的苹果示例代码。