Swift 核心数据 NSPredicate

Swift Core Data NSPredicate

我想要完成什么?

我有一个包含三个核心数据实体的应用程序:Ingredients、Cookies 和 CookieIngredients。

我希望能够根据我在厨房中指定的成分显示我可以制作哪些饼干。

我做了什么?

我已经成功地让我的应用程序达到了所有这些实体都在核心数据中进行管理的状态,并且我能够毫无问题地将成分标记为“在我的厨房里”。我可以根据成分和标题搜索 Cookie。

我卡在哪儿了?

我找不到任何示例来帮助理解如何创建 NSPredicate 以将我的 FetchedResultsController 限制为仅 Cookie,其中所有 CookieIngredient 的成分都“在我的厨房”。如果这是一个使用 MySQL 数据库的 web 应用程序,我可以通过一些内部连接来做到这一点,但我不知道如何实现类似的东西——或者即使有可能做这样的事情-- 使用核心数据。

像下面这样的谓词应该有效:

let predicate = NSPredicate(format: "ALL ingredients.inKitchen = YES")

这假设您的 Cookie 实体具有 ingredients 关系,具有名为 inKitchenboolean 标志。

如果您要获取 Cookie 对象,则谓词需要遍历与 CookieIngredient 的(对多)关系以及从那里到 [的(对一)关系=14=]。所以谓词应该是这样的:

let predicate = NSPredicate(format: "ALL cookieIngredients.ingredient.inKitchen = YES")

假设从 CookieCookieIngredient 的关系称为 "cookieIngredients",从 CookieIngredientIngredient 的关系称为 "ingredient" ).

我发现 CoreData 对多对多关系(即 ANY、ALL、NONE、SOME)的解析有点不可预测,所以我倾向于使用 SUBQUERY 来获得我想要的结果。在上述情况下,(注意 ALL inKitchen = YES 等同于说 none 有 inKitchen = NO)我会使用:

let predicate = NSPredicate(format: "SUBQUERY(cookieIngredients, $X, $X.ingredient.inKitchen == NO).@count == 0")

解决方案!

这是对我有用的谓词:

NSPredicate(format: "SUBQUERY(cookieIngredients, $X, $X.in_kitchen == true).@count == cookieIngredients.@count")