如何在Coredata中设置NSPredicate和NSEntityDescription来执行复杂的SQL查询

Tha*_*ham 1 sql iphone core-data nspredicate

我知道如何创建NSPredicate来做sql之类的"SELECT * FROM DRINK".但是这个查询怎么样:

"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;"  
Run Code Online (Sandbox Code Playgroud)

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

ger*_*ry3 5

通常使用Core Data,您将设计和使用满足您需求的数据模型.您不应该在SQL方面考虑它 - 它甚至不必使用SQL进行存储 - 您也不应该尝试将SQL查询直接转换为带有谓词的获取请求等.

这就是说,它有时可以考虑在SQL方面有帮助的WHERE建设谓词时,但真正提取请求条款归结到你需要获得以及如何收集应进行过滤和/或排序等什么实体

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

您的核心数据数据模型是什么样的?你想达到什么目的?你都尝试了些什么?

更新
听起来你的数据模型包括两个实体:饮料和成分,它们之间有多对多的关系:

喝<< - >>成分

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

喝< - >> DrinkIngredient << - >成分

注意:DrinkIngredient只有一种饮料和一种成分.饮料可以有许多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
}
Run Code Online (Sandbox Code Playgroud)

由于您使用的是Core Data而不是SQL,因此您可以采用不同的方式.例如,如果你想显示与名称和数量的成分列表中的所有饮料,只需将获取所有饮料对象(无过滤谓词),并通过您从喝DrinkIngredient关系访问成分.

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