【问题标题】:How to setup NSPredicate and NSEntityDescription in Coredata to do complicated SQL query如何在 Coredata 中设置 NSPredicate 和 NSEntityDescription 来进行复杂的 SQL 查询
【发布时间】:2011-01-15 13:35:06
【问题描述】:

我知道如何创建 NSPredicate 来执行像 "SELECT * FROM DRINK" 这样的 sql。但是这个查询怎么样:

"SELECT I.name, D_I.amount 
FROM DRINK_INGREDIENT D_I, DRINK, INGREDIENT I 
WHERE D_I.drinkID=1 AND DRINK.drinkID=1 AND I.ingredientID = D_I.ingredientID;"  

我如何为这种查询设置 NSEntityDescription 和 NSPredicate?

【问题讨论】:

    标签: iphone sql core-data nspredicate


    【解决方案1】:

    通常使用 Core Data,您将设计和使用满足您需求的数据模型。您不应该从 SQL 的角度来考虑它——它甚至不必使用 SQL 进行存储——也不应该尝试将 SQL 查询直接转换为带有谓词的 fetch 请求等。

    也就是说,在构建谓词时考虑 SQL WHERE 子句有时会有所帮助,但真正获取请求归结为您需要获取什么实体以及如何过滤和/或排序集合等。

    获取请求仅限于单个实体,因此我认为您需要多个获取请求来模拟您的查询。

    您的 Core Data 数据模型是什么样的?你想达到什么目的?到目前为止,您尝试过什么?

    更新
    听起来您的数据模型包含两个实体:Drink 和 Ingredient,它们之间存在多对多关系:

    饮料>成分

    请注意,在 Core Data 中,没有 DrinkIngredient 实体,除非您明确创建它(多对多关系还有一个附加表,但它已从您那里抽象出来)。由于您需要与附加表中的行关联的金额值,我建议在 Core Data 中添加 DrinkIngredient 实体:

    饮料 > 饮料成分 成分

    注意:DrinkIngredient 只有一种饮料和一种成分。饮料可以有多种 DrinkIngredients,成分可以被多种 DrinkIngredients 使用。

    听起来您想要获取特定饮料成分列表的名称和数量。为此,只需使用如下过滤谓词获取 DrinkIngredient 对象:

    // assuming "aDrink" is a reference to a particular Drink object
    // and "drink" is the relationship from DrinkIngredient to Drink
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"drink == %@",aDrink];
    
    // if the fetch request result array is named "ingredientList"
    // and the relationship from DrinkIngredient to Ingredient is "ingredient"
    for (DrinkIngredient *di in ingredientList) {
        NSString *ingredientName = di.ingredient.name;
        NSUInteger amount = di.amount.integerValue;
    
        // use "ingredientName" and "amount" here
    }
    

    由于您使用的是 Core Data 而不是 SQL,因此您的处理方式有所不同。例如,如果您想显示所有饮品的名称和数量的成分列表,您只需获取所有 Drink 对象(无过滤谓词),然后通过从 Drink 到 DrinkIngredient 的关系访问成分。

    同样,您应该考虑您要完成的工作,并适当地设计和使用您的数据模型。您不应该考虑 SQL 或查询。

    【讨论】:

    • 好吧,上面的查询是我用于 SQLite 的实际查询,我尝试切换到 coredata。所以我有 1 个饮料表,其中包含饮料名称和饮料 ID,包含成分名称和成分 ID 的 InGredient 表。表 Drink_Ingredient 代表了饮料和成分之间的多对多关系,即一种饮料可以有多种成分,一种成分可以在不同饮料的配方中。我知道如何从 1 个实体获取请求,但是这种情况呢?我需要改变我的数据库设计吗?
    • 我根据这些附加信息更新了我的答案,提供了更多建议。如果您有任何问题,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多