【问题标题】:Configuring an NSPredicate with multiple conditions配置具有多个条件的 NSPredicate
【发布时间】:2011-08-25 15:59:30
【问题描述】:

我不确定如何将多个条件“级联”到一个 NSPredicate 中。

我对 Core Data 还很陌生,不确定这是否是实现我想要做的事情的正确方法。

这是我想要做的:

有一个 Photo 对象与 Location 对象具有 whereTook 关系,而 Location 对象具有 photosTookThere 的倒数。

照片又具有一个名为 isFavourite 的 NSNumber 属性。

我想配置一个 NSFetchRequest,它首先检查 photosTookThere 是否存在,如果存在,则检查每个生成的 Photo 对象并仅返回设置为收藏夹的对象。

这是目前为止的代码:

request.entity = [NSEntityDescription entityForName:@"Location" inManagedObjectContext:context];
request.sortDescriptors = [NSArray arrayWithObject[NSSortDescriptorsortDescriptorWithKey:@"locationId" ascending:YES]];
request.predicate = [NSPredicate predicateWithFormat:@"photosTookThere.@count != 0"];

如何将第二个条件级联到谓词中并返回正确的结果?

【问题讨论】:

    标签: iphone objective-c xcode ios core-data


    【解决方案1】:

    只需将每个条件放在括号内并用 AND 连接即可。

    [NSPredicate predicateWithFormat:@"(photosTookThere.@count != 0) AND (isFavourite == %@)", [NSNumber numberWithBool:YES]];
    

    我还建议将“whereTook”关系的名称更改为“location”,将“photosTookThere”更改为简单的“photos”,这样更符合惯例。

    【讨论】:

    • 谢谢,我会为未来记住有关约定的评论 - 我是 Core Data 的新手。我仍然对 AND 有疑问:2011-05-15 17:52:24.346 CL Places[14321:207] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“keypath isFavourite not found in entity ' 我猜这是因为 isFavourite 在 Photo 对象上,而不是在 Location 上。照片拍摄有一个 NSSet。如何告诉谓词这是一个 NSSet 并且应该在集合的每个成员上检查 isFavourite?
    • 我明白了。是的,问题是一个论点是关于位置的,而另一个论点是关于照片的。我认为您对关系的命名使我感到困惑。如果我理解正确,那么您将获取照片,因此您的 NSEntityDescription 应该反映这一点。您需要做的是手头有您要查询的位置对象。然后,您将谓词更改为 @"(whereTook == %@) AND (isFavourite == %@)", [self location], [NSNumber numberWithBool:YES]。将 [self location] 替换为您拥有位置对象的任何位置。希望这会有所帮助。
    • 谢谢;仍然有点麻烦,但我会做一些额外的背景阅读,以防万一我错过了一些非常明显的东西。我什至可以重命名这些关系,以便它们在我使用时符合正确的约定。
    【解决方案2】:

    我最终能够使用子查询解决这个问题:

    request.predicate = [NSPredicate predicateWithFormat:
                             @"(photosTookThere.@count !=0) AND SUBQUERY(photosTookThere, $Photo, $Photo.isFavourite==1).@count >0"
                             ];
    

    【讨论】:

      【解决方案3】:

      您可以非常简单地在谓词中使用 AND 和 OR,就像在 SQL 语句中指定“where”条件一样。要检查与“whereTook”比较时看起来像您想要的 NULL,您可以与 nil (whereTook = nil) 进行比较。

      【讨论】:

      • 你的意思是(whereTook == nil)。否则它是一个任务。
      • @katzenhut 单个= 是谓词/SQLite 的有效条件。
      猜你喜欢
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 2015-02-15
      相关资源
      最近更新 更多