[英]Performing the equivalent of a union with Core Data for a UITableViewController
我知道联合是一个SQL
构造,但这是我要尝试的最佳模拟。
我有从外部来源接收的多组数据。 我在Core Data中将它们维护为单独的实体(它们只有一些共同的属性(例如,名称)),但是我想将它们呈现在同一tableView
。
假设我有一个实体Food,它与FruitGroup和VegetableGroup有关系。 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
进行子类化,并在我的子类内部,合并每个代表一个实体的多个私有NSFetchedResultsControllers
的结果。 (例如,各部分返回内部FRC的各部分调用的收益的串联)
这有意义吗?还是有更好的方法? (我看到了等效的核心数据联合查询,但是由于我的实体之间存在关联,因此我想寻求替代方法)
尽管您可以按照其他答案中的说明进行操作(通过创建抽象的Parent实体),但我不建议这样做。 与抽象父母打交道时的表现会很快变差。 这样做的原因是,Core Data会将所有子项放入基础SQLite文件中的单个表中。
我建议走另一条路。 有一个名为Food的实体,其属性描述了它是蔬菜还是水果。 然后你有一个NSFetchedResultsController
它有type
的食品作为sectionPath的,你会得到你的显示器,你想要的方式。
我建议根据对象的松散程度在Core Data中创建实体。 我不会为本田,福特和道奇创建实体,而是为Car
以及可能与制造商的类型或关系创建实体。
虽然核心数据可以由数据库支持,但归根结底,它不是数据库,而是对象图,应这样处理。 试图规范化数据库将导致对象图的性能下降。
要回答您的问题:
您不能在单个提取请求下统一不同的实体类型(如果它们不是同一实体的子类)。 您可以定义一个实体( B
)从另一个实体( A
)继承,然后由父实体( A
)提取并获得两种实体( A
和B
)
您可以尝试通过以下方式进行思考:
Item
(“ Macintosh”,“白芦笋”,...)与Group
(“ Apple”,“芦笋”,...)有关系,而Group
与“ Area
(或仅与另一个父组)有关系。
通过这种方式,您可以使用带有sectionNameKeyPath
为“ group.name”和实体Item
的单个FRC(您可以按“ group.area”进行过滤以仅选择食品)。
您可能应该研究抽象实体。 例如,您可以创建一个名为Food
的抽象实体。 然后,您可以创建Fruit
and Vegetables
,它继承了抽象实体。 您必须将Food
设置为“父实体”。
然后,您可以使用实体Food
(包括Fruit
和Vegetables
来获取所有物品。 根据您的帖子,您可能会有一个从Food
到FoodGroup
的关系。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.