核心数据应该如何与我的“不寻常”对象一起使用?

时间:2013-04-05 23:16:25

标签: ios core-data nsmanagedobject

我有一个购物清单应用程序,我正计划使用Core Data。

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

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

HybridItem

在此- (id)initWithItems:(NSArray *)items 方法中,initWithItems:数组中的项目进行了按摩和组合,因此它将显示为购物清单中的单个条目。我需要坚持实际的对象,以便参考它们的来源,添加日期等等......

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

  • HybridItem属性HybridItem设为可转换属性,但根据我所读取的内容,将其存储为“平坦”的数据blob - 如果我在以后的版本中修改我的items实体并将更新推送给我的用户,他们存储的Item会在更新后首次提取时出现问题

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

  • 的组合
  • Item保留为常规课程并在启动时搜索可组合项目,与上述相同的缺点

  • HybridItem保留为常规类,并使用HybridItem单独序列化。这有一些代码味道可以肯定

当我研究类似于我的问题时,常识是采用像这样的数组属性并将其作为一个单独的实体,并使用关系与对象相关联。但我的情况似乎不同,因为NSCoding属性实际上包含具有相同父实体(!)的实体数组。

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

我应该如何编码items

1 个答案:

答案 0 :(得分:1)

似乎最直接的方法如下:

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

请注意,此方法允许混合项目包含其他混合项目。如果你不想那样,那么你必须引入一个新的Item子类,并称之为SingleItem。然后制作RecipeItemQuickAddItem(但不是HybridItemSingleItem的子类。然后,您将创建上述关系,而是在SingleItemHybridItem

之间创建它们