我知道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但由于我的实体之间存在关系,我想寻求其他选择)
答案 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
的抽象实体。然后,您就可以创建继承抽象实体的Fruit
和Vegetables
。您必须将Food
设置为“父实体”。
然后,您可以使用实体Food
获取所有项目,其中包括Fruit
和Vegetables
。根据您的帖子,您可能会有从Food
到FoodGroup
的关系。