我有一个购物清单应用程序,我正计划使用Core Data。
我有一个杂货店Item
抽象类,它有三个子类:RecipeItem
,QuickAddItem
和HybridItem
。前两个子类很简单,但HybridClass
是不同的 - 它只是一个其他 RecipeItem
和QuickAddItem
对象的数组。
以下是它的使用方法:一旦创建了购物清单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
?
答案 0 :(得分:1)
似乎最直接的方法如下:
HybridItem
子类中,定义与抽象Item
类Item
课程中,为parentItem
课程定义名为HybridItem
的一对一关系。HybridItem
类中,根据items
数组中每个项目的数量定义要计算的任何值的瞬态属性,例如给定单位的数量。items
的多对多关系相关联的HybridItem
集合中请注意,此方法允许混合项目包含其他混合项目。如果你不想那样,那么你必须引入一个新的Item
子类,并称之为SingleItem
。然后制作RecipeItem
和QuickAddItem
(但不是HybridItem
)SingleItem
的子类。然后,您将创建上述关系,而是在SingleItem
和HybridItem