【问题标题】:NSPredicate, get results with a subset of one-to-many relationshipNSPredicate,使用一对多关系的子集获取结果
【发布时间】:2012-06-01 22:06:31
【问题描述】:

我正在使用 Core Data 和 NSFetchedResultsController

我的数据模型如下所示:

Product 具有称为dataLines 的一对多关系。 dataLine 实体具有属性名称 theWeek

我想获取所有Product,其中dataLines.theWeek == someValue。这可以通过子查询轻松完成。但这会返回所有数据线。是否可以创建一个返回ProductNSPredicate 和一个子集(如果dataLines 仅使用dataLines == someValue)?

【问题讨论】:

  • 请提供一些代码或添加一些细节。谢谢。
  • 另外,您能否解释一下如果dataLines 仅使用dataLines == someValue,是否可以创建一个返回产品和子集的NSPredicate?这是否与您的第一部分问题的目标相同?

标签: ios core-data nspredicate nsfetchedresultscontroller nsfetchrequest


【解决方案1】:

您想要达到的目标可以通过两种方式实现:

使用子查询

[NSPredicate predicateWithFormat:@"SUBQUERY(dataLines, $x, $x.theWeek == %@).@count > 0)", [NSNumber numberWithInt:18]];

或 ANY 修饰符

[NSPredicate predicateWithFormat:@"ANY dataLines.theWeek == %@", [NSNumber numberWithInt:18]];

如果您需要检查多个值,还可以执行以下操作:

[NSPredicate predicateWithFormat:@"SUBQUERY(dataLines, $x, $x.theWeek == %@ or $x.theWeek == %@).@count > 0)", [NSNumber numberWithInt:18], [NSNumber numberWithInt:19]];

同样可以应用于ANY 修饰符。 ANY ... OR ANY ....

也许如果你分享一些代码我们可以帮助你。

附:我想你不使用标量值,theWeek 是一个数字。

希望对你有帮助。

【讨论】:

    【解决方案2】:

    您应该改为获取 dataLine 属性。 假设您的 ProductdataLine 实体通过关系 someRelation 连接,那么您可以尝试此代码;

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setEntity:[NSEntityDescription entityWithName:@"dataLine" inManagedObjectContext:self.managedObjectContext]];
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"dataLines.week == %@",theWeek]];
    
    NSMutableArray *tmpProduct [[NSMutableArray init] alloc];
    NSMutableArray *tmpArray = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
    
    for (dataLine *theDataLine in tmpArray);
    NSLog(@"%@",theDataLine.someRelation.name);
    tmpProduct = theDataLine.someRelation.name;
    

    那么您只需拨打tmpProduct 即可调用或在表格视图中显示您的产品

    【讨论】:

      【解决方案3】:

      为“产品”实体创建一个获取请求:

      NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
      [fetchRequest setEntity: [NSEntityDescription entityForName:@"Product" ...]]
      

      然后使用带有“ANY”的 Product 的属性/属性创建一个谓词:

      [fetchRequest setPredicate:
        [NSPredicate predicateWithFormat:@"ANY dataLines.theWeek == %@", <whatever week>]];
      

      然后执行 fetch 以获取包含至少一个 &lt;whatever week&gt; 的 Product 数组。

      一般参见“获取托管对象”、NSPredicate 和相关文档。

      【讨论】:

      • 这基本上就是我现在正在做的。问题是这将返回所有具有所有数据行的产品。我想要的是:dataLines.theWeek = 18 和 dataLines.theWeek = 19 的产品 A。我只想返回 dataLines.theWeek = 18 的产品 A。而不是 dataLines.theWeek = 19。有可能吗?
      • 不清楚——这个产品A是同一个对象吗?如果是,你的问题很难理解
      • 您希望获取的 Product 有一个且只有一个 dataLine,例如 Week = 18?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 2020-06-06
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多