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?
通常使用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或查询.
| 归档时间: |
|
| 查看次数: |
1791 次 |
| 最近记录: |