问题
大家好,我在这里设计了我的CoreData(我会尽可能简单地写,而我的真实数据要复杂得多):
Product (Abstract)
- NSString *productName
- NSDecimalNumber *productPrice
- NSString *productType
ProductComplex : Product
- (NSSet <ProductSimple *> *)childProducts
ProductSimple : Product
- (ProductComplex *)parentProduct
基本上,Product
是一种抽象类型,它有两个属性:名称和价格。 Product有两个继承:
ProductComplex
:这可能包含许多儿童用品。ProductSimple
:这可能是复杂产品的孩子。然后,我有一个列表来显示所有产品(当然是摘要Product
)。现在我想创建一个谓词,用这些条件过滤Product
列表:
ProductComplex
(childProducts
)。childProducts.@count > 0
ProductSimple
(parentProduct
)的parentProduct = nil
。MY TRY
我正在使用NSFetchResultController
,其中entityName为Product
。我试过创建一个谓词:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"childProducts.@count > 0 OR parentProduct = nil"];
执行获取fetchResultController时会导致崩溃:
if (![self.fetchedResultsController performFetch:&error]) {...}
这是简化的崩溃原因:
***由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:'不能有非关系 subquerySUBQUERY中的集合元素(childProducts,$ child, $ child.productPrice&gt; “0”)'
请帮我为这些人创建一个过滤器。
编辑1
我甚至尝试过类似下面的谓词,以确保它有关系,但这也不起作用。
[NSPredicate predicateWithFormat:@"productType = 'complex' AND childProducts.@count > 0"]
编辑2
打开SQL调试模式后,我发现了fetch生成的SQL。阅读那个SQL查询,我认为不可能做我要求的事情:(仍然希望得到答案。
答案 0 :(得分:0)
不幸的是,这是不可能的。尽量避免在您的数据库中使用 inheritance
。您可以将 ProductComplex
和 ProductSimple
作为使用外键引用基本 Product 表的表。它可以避免继承并提高性能。