【发布时间】:2016-12-13 23:52:42
【问题描述】:
问题
大家好,我在这里将我的 CoreData 设计成这样(我会尽可能简单地编写,而我的真实数据要复杂得多):
Product (Abstract)
- NSString *productName
- NSDecimalNumber *productPrice
- NSString *productType
ProductComplex : Product
- (NSSet <ProductSimple *> *)childProducts
ProductSimple : Product
- (ProductComplex *)parentProduct
所以基本上,Product 是一个抽象类型,它有两个属性:名称和价格。 Product 有 2 个继承:
-
ProductComplex:这可能有很多子产品。 -
ProductSimple:这可能是复杂产品的子代,也可能不是。
然后,我有一个显示所有产品的列表(当然是摘要 Product)。现在我想创建一个谓词来过滤具有以下条件的Product 列表:
- 仅显示具有
childProducts(childProducts.@count > 0) 的ProductComplex。 - 只显示没有
parentProduct(parentProduct = nil) 的ProductSimple。
我的尝试
我正在使用 NSFetchResultController,其中 entityName 为 Product。我试过创建一个谓词:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"childProducts.@count > 0 OR parentProduct = nil"];
这会导致在获取 fetchResultController 时崩溃:
if (![self.fetchedResultsController performFetch:&error]) {...}
这是简化的崩溃原因:
*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“不能有非关系” 子查询中的集合元素SUBQUERY(childProducts, $child, $child.productPrice > "0")'
请帮我为这些创建一个过滤器。
编辑 1
我什至在下面尝试过类似这样的谓词以确保它具有关系,但这也不起作用。
[NSPredicate predicateWithFormat:@"productType = 'complex' AND childProducts.@count > 0"]
编辑 2
打开 SQL 调试模式后,我找到了 fetch 生成的 SQL。阅读那个 SQL 查询,我认为不可能按照我的要求做 :( 仍然希望得到答案。
【问题讨论】:
-
我认为实体名称应该是“ProductComplex”或“ProductSimple”。实体“产品”是抽象的,或者您可以说是父实体。
-
但是我的清单是复杂和简单的混合。如果我精确查询
Complex或Simple,抽象是什么意思?
标签: ios objective-c inheritance core-data nspredicate