2011-04-04 57 views
3

如何编写NSPredicate以获取与数组中的值匹配的行? E.g:如何使用带有谓词的“IN”运算符

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

如果UserIDArray包含用户的ID,一个人如何获取与此数组中的值相匹配的用户名?

回答

5

让我从这个建议开始。核心数据不是SQL。实体不是表格。对象不是行。列不是属性/属性。核心数据是一个对象图管理系统,它可能会或可能不会持久化对象图,并且可能会或可能不会在后台使用SQL来做到这一点。试图用SQL语言来思考核心数据会导致你完全误解核心数据,并导致很多悲伤和浪费时间。

因为核心数据是基于对象的,所以当您执行提取操作时,您将得到一个对象数组。为了找到一个特定的值,你然后查询这些对象的各自属性的值。

假设你有以下实体:

User{ 
    userName:string 
    userID:string 
} 

...并希望找到所有用户的用户名为对应的用户ID字符串数组。你将创建一个NSFetchRequest并将其实体设置为“User”。那么你可以使用这样的断言:

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

的获取将返回与User实体的属性名称键配置NSManagedObjects阵列(或子类)。要找到阵列中的每个管理对象的userName属性的值,你会问对象的它该值的属性,像这样:

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

只是忘记你知道SQL或类似的数据库系统所需的一切。核心数据并不是一个真正的数据库,所以试图用这些术语来思考它会让你感到困惑。核心数据都是关于对象的。

1

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

当您执行获取请求时,您将获得对象,但您无法只获取设置为之前设置为NSManagedObject对象的部分值。

我会在你的情况下做的是检索符合你的谓词的对象,然后在得到的NSArray上使用valueForKey:来获取用户名列表。

假设你有一个这样的实体:

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 
}