【问题标题】:How can I know the class type of an abstract entity in a NSPredicate?如何知道 NSPredicate 中抽象实体的类类型?
【发布时间】:2012-06-17 16:03:33
【问题描述】:

使用核心数据我想获取一些数据。我的模型使用了一些抽象实体,见附图,其中 QuantifiedIngredient 是一个抽象类。 我想获取至少有一个 RecipeQuantifiedIngredients 的成分实体,但中间是 QuantifiedIngredient,它是一个抽象类。

我该怎么做,如何测试 NSPredicate 中抽象类的实际类型?有什么想法或建议吗?

我发现的唯一线索是: How can you reference child entity name in a predicate for a fetch request of the parent entity?

是否可以在我的 QuantifiedIngredient 中使用自定义属性来了解它是否是 RecipeQuantifiedIngredient?比如isRecipeQuantifiedIngredient?

非常感谢您的帮助。

【问题讨论】:

    标签: core-data ios5 nspredicate nsfetchrequest


    【解决方案1】:

    如果RecipeQuantifiedIngredient 中需要recipe,您可以尝试进行提取,检查是否有任何ingredient.recipe。我认为,这会奏效。

    自定义属性(以标志形式存在)也适用于您。您只需在添加或删除所有recipeQuantifiedIngredient 时设置和取消设置它。

    【讨论】:

    • 实际问题是否可以处理从 NSPredicate 继承的问题。我已经考虑过添加一个标志,但从建模的角度来看,这是一个令人讨厌的解决方案,尽管可能是一种解决方法。还是谢谢。
    【解决方案2】:

    我不想花时间把它翻译成 CoreData-speak 所以这是我在 SQL 中的想法:

    SELECT * FROM quantifiedIngredients WHERE recipe <> NULL
    

    或类似的东西。这本质上是 Nikita 关于使用标志的建议,只是“标志”是属性的存在。我不知道CoreData 在遇到没有recipeGroceryQuantifiedIngredients 时会如何反应,我认为KVO 会抛出异常。您可能会大胆地添加一个类别:

    @interface GroceryQuantifiedIngredients (KVOHack)
    -(id)recipe;
    @end
    
    @implementation GroceryQuantifiedIngredients (KVOHack)
    -(id) recipe { return nil; }
    @end
    

    这当然需要 CoreData 枚举所有 quantifiedIngredients,但我认为无论如何它都必须这样做,并且 return nil 应该优化成微小的代码。另一个考虑因素是这是否会对您的其余代码产生不良影响;你必须打那个电话。

    当我完成这件事时,另一个想到的想法是做这样的事情(我现在对我的伪代码感到真的松了):

    SELECT * FROM quantifiedIngredients WHERE [i respondsToSelector:@selector(recipe)];
    

    明白我的意思了吗?我忘记了 CoreData 是否允许您在使用谓词或 fetchedThingamabobbers 时使用某种游标,如果可以的话,我认为这是您最好的选择。不管怎样,现在是星期天下午,所以这些东西留给读者作为练习。

    +1 提出一个好问题。

    【讨论】:

    • 问题在于 SQL 使用实体关系模型,其中没有继承或多对多关系。因此,在 SQL 级别工作毫无意义,因为 Core Data 使用对象模型(具有继承和多对多关系)。所以,你说的这就像在 C++ 中创建一个程序并在汇编程序中进行一些修改(当然不是那么繁重)。
    • 你所说的responsesToSelector是我正在寻找的,似乎有一些东西叫做className,但它不适用于SQL持久存储,但它适用于其他存储。这很好奇。除了 className 或 respondsToSelector 之外,投射呢?一周前我向 Apple 发送了一封电子邮件,他们告诉我他们必须对此进行研究(这是一个付费问题)。
    • 你没有答案,但你说的很有趣。非常感谢。
    • 我忘了说你的 KVO 解决方案不起作用。编译时它说抽象类在 SQL 中没有具有该名称的属性。感谢您的解决方案。我已经考虑过并尝试过。
    • 好的,Ricardo,别睡太久!
    猜你喜欢
    • 2011-07-05
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2022-01-20
    • 2010-12-24
    • 2013-12-10
    相关资源
    最近更新 更多