如何在谓词中使用“IN”运算符

时间:2011-04-04 12:05:24

标签: iphone ipad core-data nspredicate nsfetchrequest

如何编写NSPredicate来获取与数组中的值匹配的行? E.g:

[NSPredicate predicateWithFormat:@"UserName IN %@",UserIDArray];

如果UserIDArray包含用户ID,那么如何获取与此数组中的值匹配的用户名?

2 个答案:

答案 0 :(得分:5)

让我先从这个建议开始。核心数据不是SQL。实体不是表格。对象不是行。列不是属性/属性。核心数据是一个对象图管理系统,可能会或可能不会持久保存对象图,并且可能会或可能不会使用远远落后的SQL来执行此操作。试图用SQL术语来思考核心数据将导致你完全误解核心数据并导致更多的悲伤和浪费时间。

因为Core Data基于对象,所以当你进行提取时,你会得到一个对象数组。要查找特定值,您可以在这些对象中查询其各自属性的值。

假设您有以下实体:

User{
    userName:string
    userID:string
}

...并希望找到其userName对应于userID字符串数组的所有用户。您将创建NSFetchRequest并将其实体设置为“User”。然后你会使用这样的谓词:

[NSPredicate predicateWithFormat:@"userID IN %@",arrayOfUserIDs];

fetch将返回使用User实体的属性名称键配置的NSManagedObjects(或子类)数组。要查找数组中每个托管对象的userName属性的值,您可以向对象询问其属性的值,如下所示:

NSString *aUserName=[aUserEntityObject valueForKey:@"userName"];

忘记您对SQL或类似数据库系统的所有了解。核心数据并不是真正的数据库,因此试图用这些术语来思考它只会让你感到困惑。核心数据都是关于对象的。

答案 1 :(得分:1)

你的谓词很好,但你的问题表明你并没有完全理解正在发生的事情。

当您执行获取请求时,您获得了对象,您之前只能获得您设置为NSManagedObject个对象的部分值。

在您的情况下,我要做的是检索与谓词匹配的对象,然后在生成的valueForKey:上使用NSArray来获取用户名列表。

假设您有这样的实体:

User{
    name:string
    identifier:string
}

代码可以是:

NSArray *ids = @[@"a", @"b", @"c"];
NSManagedObjectContext *context = self.managedObjectContext;
NSFetchRequest *userRequest = [[NSFetchRequest alloc] init];
[userRequest setEntity:[NSEntityDescription entityForName:@"User" inManagedObjectContext:context]];
[elementsRequest setPredicate:[NSPredicate predicateWithFormat:@"identifier IN %@", ids]];

NSError *error;
NSArray *result = [context executeFetchRequest:userRequest error:&error];
if (result) {
    NSArray *names = [result valueForKey:@"_id"];
    // names is : @[@"the name of a", @"the name of b", @"the name of c"]
} else {
    // TREAT YOUR ERROR
}