0

我的核心数据对象模型具有三个嵌套对象,如下所示:

Item
  Beverage
    Brand

当我第一次创建 Item 的实例时

Item *item = [NSEntityDescription insertNewObjectForEntityForName:@"Item" inManagedObjectContext:self.objectContext];

item.beverage 属性为零。接下来我想在 item.beverage.brand.title 属性中存储一个值。

我是否必须创建一个 Beverage 实例并将其分配给 item.beverage,然后创建一个 Brand 实例并将其分配给 item.beverage.brand。

item.beverage = [NSEntityDescription insertNewObjectForEntityForName:@"Beverage" inManagedObjectContext:self.objectContext];

item.beverage.brand = [NSEntityDescription insertNewObjectForEntityForName:@"Brand" inManagedObjectContext:self.objectContext];

在我最终可以将值分配给 title 属性之前?

item.beverage.brand.title=@"Sample Title";

有没有更短/更简洁的方法来做到这一点?

4

2 回答 2

1

您需要在对象图中创建每个对象。我不知道任何核心数据提供的快捷方式。如果您发现自己编写了大量样板代码,您当然可以编写自己的方法、类别或宏来减少冗长。

于 2012-08-31T21:06:26.953 回答
0

如果您的单独实体的目的主要是封装行为或数据规范化,则有时您永远不希望在不自动插入子项的情况下插入父项。在您的情况下,这可能是一个始终无误地具有 Beverage 的 Item。

在这种情况下,您可以使用级联删除规则将 Item 和 Beverage 之间的关系设置为非可选且一对一的关系。总之,这些反映了一个事实,即没有另一个是没有意义的。不幸的是,在这种情况下,插入 Item仍然不会插入 Beverage。为此,请覆盖awakeFromInsert以执行此插入,然后每当创建 Item 实例时它都会自动出现。

另一方面,如果一个项目可能没有饮料,但是当它有时,饮料总是有一个名称,正如另一位发帖人评论的那样,也有可能添加自定义逻辑 - Item.setBrandname,插入饮料如果它不存在 - 是一个可行的解决方案。

您的业​​务逻辑推动了这种决策。

此外,fwiw, 'item' 虽然不是保留关键字,但可能是一个避免作为类/变量名称的好词,因为它是一个抽象/编程相关的概念。这与我的其他答案完全不同。;-)

于 2012-09-14T21:10:23.837 回答