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

Cocoa 将对象添加到NSArrayController并将其保存到实体中,cocoa,core-data,nsarraycontroller,Cocoa,Core Data,Nsarraycontroller,我有一个NSArrayController,它连接到核心数据中的实体。我有一个IBOutlet连接到NSArrayController,这样我可以从我的委托添加对象 我正在尝试使用一些预设将对象添加到NSArrayController。到目前为止,我已经了解了如何使用添加对象 [cards add:sender]; 这可以工作,但会添加一个空白对象。当我退出应用程序时,它会将这个对象保存到实体中,这样当我希望它再次出现时,它仍然存在 但是我也找到了一种方法来创建一个带有预设的新对象,但是如果像

我有一个NSArrayController,它连接到核心数据中的实体。我有一个IBOutlet连接到NSArrayController,这样我可以从我的委托添加对象

我正在尝试使用一些预设将对象添加到NSArrayController。到目前为止,我已经了解了如何使用添加对象

[cards add:sender];
这可以工作,但会添加一个空白对象。当我退出应用程序时,它会将这个对象保存到实体中,这样当我希望它再次出现时,它仍然存在

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

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

是否有其他方法可以创建带有预设的新对象,但也可以使其保存?我不熟悉核心数据,所以我不是100%了解所有这些。也许有一种方法可以创建指向实际实体的指针并从中编辑它?

可以将NSArrayController子类化并重新实现添加功能,或者将实体子类化并重新实现awakeFromInsert。这两个位置都是预设对象值的可接受位置

对于NSArrayController子类:

@implementation CardsArrayController

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

@end

将NSArrayController子类化并重新实现
add
功能,或者将实体子类化并重新实现
awakeFromInsert
。这两个位置都是预设对象值的可接受位置

对于NSArrayController子类:

@implementation CardsArrayController

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

@end

无论以何种方式添加对象,获取
managedObjectContext
引用并保存上下文都将保存对象

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

NSError *error;
AppDelegate *appD = [NSApp delegate];
[appD.managedObjectContext save:&error];
或者您可以调用
[appD saveAction:Nil]
。这还会尝试在保存上下文之前提交编辑

或者您可以将一个按钮连接到
saveAction:
(这是一个
iAction
)以在单击按钮时保存上下文

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

无论以何种方式添加对象,获取
managedObjectContext
引用并保存上下文都将保存对象

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

NSError *error;
AppDelegate *appD = [NSApp delegate];
[appD.managedObjectContext save:&error];
或者您可以调用
[appD saveAction:Nil]
。这还会尝试在保存上下文之前提交编辑

或者您可以将一个按钮连接到
saveAction:
(这是一个
iAction
)以在单击按钮时保存上下文

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

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

实际上,托管对象支持KVC,因此它们可以像字典一样处理某些事情(setValue:forKey等),但这就是相似性的终点。无法将NSDictionary插入到控制核心数据实体的NSArrayController中。必须使用核心数据API创建实体

e、 g

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

名为
-(void)的
NSArrayController
iAction添加:(id)发送方
是一种方便快捷方式,它确实可以创建指定给
NSArrayController
的类型(和名称)的新实体,并将其添加到控制器内容中。但事实上——因为它不接收任何参数——它创建了一个“空白”实体。空白表示-具有模型中定义的默认值

本页的第一个答案正确地建议您在自己的
NSArrayController
子类中覆盖
add:
iAction
,以便在将新实体插入
NSArrayController
内容之前创建和设置它

所以它看起来像:

@implementation CardsArrayController

-(void) add:(id)sender {
     NSManagedObject *myNewEntity = [NSEntityDescription insertNewObjectForEntityForName:@"MyEntityName" inManagedObjectContext:self.managedObjectContext];
    //do object set up here...
    [myNewEntity setValue@"Happy Birthday" forKey:@"title"];
    [self addObject:newItem];
}

@end

我希望这能澄清一点,但您需要阅读有关核心数据的内容,并浏览一些基于核心数据的应用程序的apple示例代码。

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

实际上,托管对象支持KVC,因此它们可以像字典一样处理某些事情(setValue:forKey等),但这就是相似性的终点。无法将NSDictionary插入到控制核心数据实体的NSArrayController中。必须使用核心数据API创建实体

e、 g

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

名为
-(void)的
NSArrayController
iAction添加:(id)发送方
是一种方便快捷方式,它确实可以创建指定给
NSArrayController
的类型(和名称)的新实体,并将其添加到控制器内容中。但事实上——因为它不接收任何参数——它创建了一个“空白”实体。空白表示-默认值为