Swift核心数据NSPredicate

时间:2017-12-11 05:55:18

标签: swift core-data nsfetchedresultscontroller

我想要完成什么?

我有一个包含三个Core Data实体的应用程序:Ingredients,Cookies和CookieIngredients。

  • 配料是鸡蛋,牛奶,黄油等,还有Bool,表明我的厨房里是否含有这种成分。
  • 饼干是巧克力片,燕麦片葡萄干等。
  • CookieIngredients是每个cookie所需的每种成分的单位。

我希望能够根据我在厨房里指出的成分来显示我可以制作的饼干。

我做了什么?

我已成功将我的应用程序带到一个状态,其中所有这些实体都在Core Data中管理,并且我能够将成分标记为“在我的厨房中”,没有任何问题。我可以根据成分和标题搜索Cookies。

我被困在哪里?

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

3 个答案:

答案 0 :(得分:2)

以下谓词应该有效:

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

这假设您的Cookie实体之间存在ingredients关系,boolean标记为inKitchen

答案 1 :(得分:2)

如果要获取Cookie个对象,则谓词需要遍历(to-many)与CookieIngredient的关系,并从那里将(到一个)关系遍历到{{1 }}。所以谓词应该是这样的:

Ingredient

这假定从let predicate = NSPredicate(format: "ALL cookieIngredients.ingredient.inKitchen = YES") Cookie的关系被称为" cookieIngredients"从CookieIngredientCookieIngredient的关系被称为"成分")。

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

Ingredient

答案 2 :(得分:1)

的解决方案!

这是对我有用的谓词:

$(function() { var checkboxstat = $("#triggerSTAT"); var checkbox = $("#trigger"); var hidden = $("#hidden_fields"); var hidden_f = $("hidden_field"); var checkbox2 = $("#trigger2"); var nogales = $("#hidden_nogs"); var nogi = $("#hidden_nogi"); hidden.hide(); nogales.hide(); checkbox.change(function() { if ($('#trigger').is(':checked') && $('#triggerSTAT').is(':checked')) { hidden.prop('disabled', false).show(); hidden_f.prop('disabled', false); } else { hidden.prop('disabled', true).hide(); hidden_f('disabled', true); $("#hidden_field").disabled("disabled"); } else if ($('#trigger2').is(':checked') && $('#triggerSTAT').is(':checked')) { nogales.prop('disabled', false).show(); nogi.prop('disabled', false); } } else { nogales.prop('disabled', true).hide(); nogi('disabled', true); $("#hidden_nogi").disabled("disabled"); } }); });