为UITableViewController执行与Core Data的联合等价物

时间:2014-01-17 03:58:53

标签: ios core-data uitableview nsfetchedresultscontroller

我知道union是SQL构造,但它是我想要做的最好的模拟。

我有多组数据,我是从外部来源收到的。我将它们作为Core Data中的单独实体进行维护(它们只有一些共同的属性(例如名称)),但我想将它们呈现在同一个tableView中。

假设我有一个与FruitGroup和VegetableGroup有关系的实体Food。 FruitGroup与Fruit有关系,它与FruitType有关系。蔬菜集团很相似。

如何将FruitGroup.Fruit.name VegetableGroup.Vegetable.name用作sectionTitles?和FruitGroup.Fruit.FruitType.name :用于行数据的VegetableGroup.Vegetable.VegetableType.name。 (我试着想出一个从食物中走下来的谓词,但这似乎不可行)

示例数据示例(我的群体与水果和蔬菜相比更加不同,因此重新制作数据模型不是一种选择):

Food
  FruitGroup
     Apple
         Macintosh
         Granny Smith
     Pear
         Bartlett
         Asian
         Anjou
  VegetableGroup
     Asparagus
         white
         wild
     Peas
         baby
         split

我希望将其显示为:

Apple [section]
   Macintosh   [row]
   Granny Smith
Pear
   Bartlett
   Asian
   Anjou
Asparagus
   white
   wild
Peas
   baby
   split

我可以在NSFetchedResultsControllers中使用多个UITableViewController,并在每个UITableViewDataSource方法中有条件地选择FRC,但这并不干净。

我正在考虑子类化NSFetchedResultsController,并且在我的子类内部,合并多个私有NSFetchedResultsControllers的结果,每个私有{{1}}代表一个实体。 (例如,部分返回内部FRC的部分调用的返回的串联)

这是否有意义 - 还是有更好的方法? (我看到Core Data Union Query Equivalent但由于我的实体之间存在关系,我想寻求其他选择)

3 个答案:

答案 0 :(得分:1)

虽然您可以按照其他答案(通过创建抽象的Parent实体)中的描述来执行此操作,但我不推荐它。处理抽象父母时的表现会很快变坏。原因是Core Data会将所有子项放入底层SQLite文件中的单个表中。

我建议走另一条路。有一个名为Food的实体,其属性描述它是蔬菜还是水果。然后你有一个NSFetchedResultsController,其中包含食物项目的type作为sectionPath,你将以你想要的方式显示你的显示。

我建议根据对象的内容在非常松散的级别创建Core Data中的实体。我不会为本田,福特和道奇创建实体,但会为Car创建一个实体,或者可能与制造商打字或建立关系。

虽然Core Data 可以由数据库支持,但在一天结束时它不是数据库而是对象图,应该这样对待。尝试规范化数据库将导致对象图的性能不佳。

答案 1 :(得分:0)

回答你的问题:
您无法在单个提取请求下统一不同的实体类型(如果它们不是同一实体的子类)。您可以定义一个实体(B)继承自另一个实体(A),然后由父实体(A)获取并获取两种实体(A s和B s)

你可以这样想一想:

Item(“Macintosh”,“White Asparagus”,...)与Group(“Apple”,“Asparagus”,......)和{{1}有关系与Group(或简单地与另一个父组)有关系。

通过这种方式,您可以使用Area“group.name”和实体sectionNameKeyPath的单个FRC(您可以按“group.area”过滤以仅选择食物项目。) />

答案 2 :(得分:0)

你应该考虑抽象实体。例如,您可以创建一个名为Food的抽象实体。然后,您就可以创建继承抽象实体的FruitVegetables。您必须将Food设置为“父实体”。

然后,您可以使用实体Food获取所有项目,其中包括FruitVegetables。根据您的帖子,您可能会有从FoodFoodGroup的关系。