我知道 union 是一个 SQL
结构,但它是我正在尝试做的事情的最佳类比。
我从外部源接收到多组数据。我将它们作为 Core Data 中的独立实体进行维护(它们只有一些共同的属性(例如名称)),但我想将它们呈现在同一个 tableView
中。
假设我有一个与 FruitGroup 和 VegetableGroup 有关系的实体 Food。 FruitGroup 与 Fruit 有关系,Fruit 与 FruitType 有关系。 VegetableGroup 类似。
如何使用 FruitGroup.Fruit.name 和 VegetableGroup.Vegetable.name 作为 sectionTitles? FruitGroup.Fruit.FruitType.name 和 VegetableGroup.Vegetable.VegetableType.name 用于行数据。 (我尝试想出一个从 Food 走下来的谓词,但这似乎行不通)
示例建模数据(我的组比水果和蔬菜更不同,所以重新做我的数据模型不是一种选择):
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
我可以在 UITableViewController
中使用多个 NSFetchedResultsControllers
并在每个 UITableViewDataSource
方法中有条件地选择 FRC,但这感觉并不好干净。
我正在考虑对 NSFetchedResultsController
进行子类化,并在我的子类内部合并多个私有(private) NSFetchedResultsControllers
的结果,每个都代表一个实体。 (例如,sections 返回内部 FRC 的 sections 调用返回的串联)
这是否有意义 - 还是有更好的方法? (我看到了Core Data Union Query Equivalent,但由于我的实体之间存在关系,所以我想寻求替代方案)
最佳答案
虽然您可以按照其他答案中的描述执行此操作(通过创建抽象父实体),但我不推荐这样做。与抽象 parent 打交道时的表现很快就会变差。这样做的原因是 Core Data 会将所有子项放入底层 SQLite 文件中的单个表中。
我建议走另一条路。有一个名为 Food 的实体,其属性描述它是蔬菜还是水果。然后你有一个 NSFetchedResultsController
,它有食物的 type
作为 sectionPath ,你将按照你想要的方式显示。
我建议在 Core Data 中根据对象的内容创建非常松散的实体。我不会为 Honda、Ford 和 Dodge 创建实体,但会为 Car
创建一个实体,可能还需要类型或与制造商的关系。
虽然核心数据可以由数据库支持,但归根结底,它不是数据库,而是对象图,应该这样对待。尝试规范化数据库将导致对象图性能不佳。
关于ios - 为 UITableViewController 执行与核心数据联合的等效操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21177593/