如何编写NSPredicate以获取与数组中的值匹配的行? E.g:如何使用带有谓词的“IN”运算符
[NSPredicate predicateWithFormat:@"UserName IN %@",UserIDArray];
如果UserIDArray
包含用户的ID,一个人如何获取与此数组中的值相匹配的用户名?
如何编写NSPredicate以获取与数组中的值匹配的行? E.g:如何使用带有谓词的“IN”运算符
[NSPredicate predicateWithFormat:@"UserName IN %@",UserIDArray];
如果UserIDArray
包含用户的ID,一个人如何获取与此数组中的值相匹配的用户名?
让我从这个建议开始。核心数据不是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或类似的数据库系统所需的一切。核心数据并不是一个真正的数据库,所以试图用这些术语来思考它会让你感到困惑。核心数据都是关于对象的。
你的谓词很好,但你的问题表明你不完全理解正在发生的事情。
当您执行获取请求时,您将获得对象,但您无法只获取设置为之前设置为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
}