1

我有一个购物清单应用程序,我计划将 Core Data 与它一起使用。

我有一个杂货Item抽象类,它有三个子类:RecipeItemQuickAddItemHybridItem。前两个子类很简单,但HybridClass不同 - 它只是 ivar 是other RecipeItemQuickAddItem对象的数组。

下面是它的使用方法:一旦创建了购物清单 Item 对象,所有Item具有匹配单位类型的对象(例如 1 磅糖,1/2 磅糖)都被放入数组中NSArray *items,并HybridItem使用以下方法初始化:

- (id)initWithItems:(NSArray *)items

在此initWithItems:方法中,items数组中的项目被按摩和组合,因此它将在杂货清单中显示为单个条目。我需要抓住实际的对象,以便参考它们的来源、添加日期等等......

当我开始为 Core Data 规划架构时,我不确定如何将HybridItem类转换为 NSManagedObject。我考虑过的选项:

  • 使HybridItem属性items成为可转换的属性,但从我所读的内容来看,它被存储为“平面”数据块 - 如果我Item在以后的构建中修改我的实体并将更新推送给我的用户,他们的存储HybridItem将在他们这样做时引起问题他们更新后的第一次获取

  • HybridItem实体设为瞬态实体Item,并在每次启动应用时搜索可组合的对象。缺点是这将导致用户等待Item对象的组合

  • 保持HybridItem作为常规类并在启动时搜索可组合项,缺点与上述相同

  • 将 保留HybridItem为常规类并使用NSCoding. 可以肯定的是,这有一些代码气味

当我研究与我类似的问题时,普遍的看法是把像这样的数组的属性做成一个单独的实体,并使用关系与对象关联。但我的情况似乎不同,因为该items属性实际上包含具有相同父实体(!)的实体数组。

我最后的考虑是我已经排除了只是不使用核心数据。这将不起作用,因为我的 Items 实体将拥有其他具有重要关系(数量、计量单位)的实体,这将使使用 Core Data 变得不可行。

我应该如何编码我的HybridItem

4

1 回答 1

1

似乎最直接的方法如下:

  • 在您的子类中,定义与抽象类HybridItem的一对多关系Item
  • 在类中,定义调用类的Item一对一关系。parentItemHybridItem
  • 使这两种关系彼此相反
  • HybridItem类中,为要根据items数组中每个项目的数量(例如给定单位的数量)计算的任何值定义瞬态属性。
  • 当您运行算法将可组合项目收集到单个混合项目中时,只需将这些项目添加到与的一对多关系items关联的集合中HybridItem

请注意,这种方法确实允许混合项目包含其他混合项目。如果您不希望这样,那么您将不得不引入一个新的子类Item并将其命名为SingleItem. 然后创建RecipeItemQuickAddItem(但不是HybridItem) 的子类SingleItem。然后您将创建上述关系,而是在SingleItem和之间创建它们HybridItem

于 2013-04-05T23:32:31.213 回答