NSPredicate过滤了coredata

时间:2016-08-08 09:10:39

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

问题

大家好,我在这里设计了我的CoreData(我会尽可能简单地写,而我的真实数据要复杂得多):

Product (Abstract)
   - NSString *productName
   - NSDecimalNumber *productPrice
   - NSString *productType

ProductComplex : Product
   - (NSSet <ProductSimple *> *)childProducts

ProductSimple : Product
   - (ProductComplex *)parentProduct

基本上,Product是一种抽象类型,它有两个属性:名称和价格。 Product有两个继承:

  1. ProductComplex:这可能包含许多儿童用品。
  2. ProductSimple:这可能是复杂产品的孩子。
  3. 然后,我有一个列表来显示所有产品(当然是摘要Product)。现在我想创建一个谓词,用这些条件过滤Product列表:

    1. 仅显示ProductComplexchildProducts)。
    2. childProducts.@count > 0
    3. 仅显示没有任何ProductSimpleparentProduct)的parentProduct = nil
    4. 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查询,我认为不可能做我要求的事情:(仍然希望得到答案。

1 个答案:

答案 0 :(得分:0)

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