【问题标题】:NSPredicate filter inherited object in coredataNSPredicate过滤coredata中的继承对象
【发布时间】: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 个继承:

  1. ProductComplex:这可能有很多子产品。
  2. ProductSimple:这可能是复杂产品的子代,也可能不是。

然后,我有一个显示所有产品的列表(当然是摘要 Product)。现在我想创建一个谓词来过滤具有以下条件的Product 列表:

  1. 仅显示具有childProducts (childProducts.@count &gt; 0) 的ProductComplex
  2. 只显示没有parentProduct (parentProduct = nil) 的ProductSimple

我的尝试

我正在使用 NSFetchResultController,其中 entityName 为 Product。我试过创建一个谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"childProducts.@count > 0 OR parentProduct = nil"];

这会导致在获取 fetchResultController 时崩溃:

if (![self.fetchedResultsController performFetch:&amp;error]) {...}

这是简化的崩溃原因:

*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“不能有非关系” 子查询中的集合元素SUBQUERY(childProducts, $child, $child.productPrice > "0")'

请帮我为这些创建一个过滤器。

编辑 1

我什至在下面尝试过类似这样的谓词以确保它具有关系,但这也不起作用。

[NSPredicate predicateWithFormat:@"productType = 'complex' AND childProducts.@count &gt; 0"]

编辑 2

打开 SQL 调试模式后,我找到了 fetch 生成的 SQL。阅读那个 SQL 查询,我认为不可能按照我的要求做 :( 仍然希望得到答案。

【问题讨论】:

  • 我认为实体名称应该是“ProductComplex”或“ProductSimple”。实体“产品”是抽象的,或者您可以说是父实体。
  • 但是我的清单是复杂和简单的混合。如果我精确查询ComplexSimple,抽象是什么意思?

标签: ios objective-c inheritance core-data nspredicate


【解决方案1】:

不幸的是,这是不可能的。尽量避免在您的数据库中使用inheritance。您可以将ProductComplexProductSimple 作为表,并使用外键引用基本产品表。它可以避免继承并提高性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    相关资源
    最近更新 更多