以编程方式添加到核心数据实体(如 IB 绑定“添加”)

Posted

技术标签:

【中文标题】以编程方式添加到核心数据实体(如 IB 绑定“添加”)【英文标题】:Programmatically adding to a Core Data entity (like IB binding 'add') 【发布时间】:2011-02-21 13:54:43 【问题描述】:

我有一个核心数据模型,其中包含一个名为 clients 的实体,它由以下属性组成:

如果我单击“添加客户端”按钮并打开以下窗口:

同时以编程方式为每个属性添加新条目的正确方法是什么(与绑定的 IB“添加”按钮如何与 NSArrayController 一起使用类似的方式)并让它们出现在'添加客户端'窗口进行编辑? 'add client' 窗口中的文本字段绑定到 client 实体的相应属性(仍然缺少一两个)。我现在的代码是:

- (IBAction)addNewClient:(id)sender;

    [addClientsWindow makeKeyAndOrderFront:self];
    //NSManagedObjectContext *clientsMoc= [clientsController managedObjectContext];
    //[clientsMoc addObject:[clientsMoc newObject]];
    [clientsController addObject:[clientsController newObject]];

这适用于该项目中的其他实体,但不适用于 client,因为我添加了关系类型(它会在控制台中引发 KVC 错误)。我想这是因为我正在处理 NSArrayController 而不是 NSManagedObjectContext 但注释掉的代码对我不起作用。这种尝试是从previous question 开始的,因为问题发生了很大变化,我正在努力实施给出的建议。我真的需要一个好的起点,而苹果开发文档并没有帮助我理解这一点。

提前致谢!

----更新----

我是否在这个问题中解释得很糟糕?我是新来的,但认为可能会尝试回答。由于某种原因,谷歌搜索这很困难。我可能通过不相关的谷歌搜索找到了类似于解决方案的东西。幸运的是,它与此相关。

- (IBAction)addNewClient:(id)sender;

    [addClientsWindow makeKeyAndOrderFront:self];
    NSManagedObjectContext *clientsMoc= [clientsController managedObjectContext];
    NSManagedObject *clientsEntity = [NSEntityDescription
                                     insertNewObjectForEntityForName:@"Clients" 
                                       inManagedObjectContext:clientsMoc];
    [clientsEntity setValue:@"name" forKey:@"clientName"];
    [clientsEntity setValue:@"company" forKey:@"clientCompany"];
    [clientsEntity setValue:@"address" forKey:@"clientAddress"];
    [clientsEntity setValue:@"11111111" forKey:@"clientLandline"];
    [clientsEntity setValue:@"email@gmail.com" forKey:@"clientEmail"];

这为客户实体创建了一个全新的条目——我没有意识到我必须为每个属性做一个单独的值。但 KVC 错误仍在继续,我根本找不到解决方案。 Apple 开发文档实际上对 here 很有帮助,并且将 NSBindingDebugLogLevel 1 添加到“启动时要传递的参数”列表中可以让我详细了解导致问题的确切原因。这是一个与 NSTableColumn 的旧绑定,尚未更新。

【问题讨论】:

【参考方案1】:

这可能是我想要的解决方案:

- (IBAction)addNewClient:(id)sender;

    [addClientsWindow makeKeyAndOrderFront:self];
    NSManagedObjectContext *clientsMoc= [clientsController managedObjectContext];
    NSManagedObject *clientsEntity = [NSEntityDescription
                                     insertNewObjectForEntityForName:@"Clients" 
                                       inManagedObjectContext:clientsMoc];
    [clientsEntity setValue:@"name" forKey:@"clientName"];
    [clientsEntity setValue:@"company" forKey:@"clientCompany"];
    [clientsEntity setValue:@"address" forKey:@"clientAddress"];
    [clientsEntity setValue:@"11111111" forKey:@"clientLandline"];
    [clientsEntity setValue:@"email@gmail.com" forKey:@"clientEmail"];

这为客户实体创建了一个全新的条目——我没有意识到我必须为每个属性做一个单独的值。 KVC 错误仍在继续,我根本找不到解决方案。 Apple 开发文档实际上对 here 很有帮助,并且将 NSBindingDebugLogLevel 1 添加到“启动时要传递的参数”列表中可以让我详细了解导致问题的确切原因。这是一个与 NSTableColumn 的旧绑定,尚未更新。

【讨论】:

以上是关于以编程方式添加到核心数据实体(如 IB 绑定“添加”)的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式创建实体并将其添加到数组控制器

如何将 DataGridView 组合框添加到绑定的 DataGridView 数据源(以编程方式)

Swift:以编程方式添加视图时,UIScrollView 的可滚动内容大小不明确,而不使用 IB

Core Data 以编程方式向条目添加属性

以编程方式设置核心数据 - NSManagedObjectContext 来自哪里?

以编程方式创建视图与 IB 相比的效率