如何编写 NSPredicate 来获取与数组中的值匹配的行?例如:
[NSPredicate predicateWithFormat:@"UserName IN %@",UserIDArray];
如果UserIDArray
包含用户 ID,如何获取与该数组中的值匹配的用户名?
如何编写 NSPredicate 来获取与数组中的值匹配的行?例如:
[NSPredicate predicateWithFormat:@"UserName IN %@",UserIDArray];
如果UserIDArray
包含用户 ID,如何获取与该数组中的值匹配的用户名?
让我从这个建议开始。核心数据不是 SQL。实体不是表格。对象不是行。列不是属性/属性。Core Data 是一个对象图管理系统,它可能会也可能不会持久化对象图,并且可能会或可能不会在幕后使用 SQL 来做到这一点。试图用 SQL 术语来思考 Core Data 会导致你完全误解 Core Data 并导致很多痛苦和浪费时间。
因为 Core Data 是基于对象的,所以当你进行 fetch 时,你会得到一个对象数组。要查找特定值,然后查询这些对象以获取它们各自属性的值。
假设您有以下实体:
User{
userName:string
userID:string
}
...并希望找到所有用户的用户名对应于用户ID字符串数组。您将创建一个 NSFetchRequest 并将其实体设置为“用户”。然后你会使用这样的谓词:
[NSPredicate predicateWithFormat:@"userID IN %@",arrayOfUserIDs];
fetch 将返回一个 NSManagedObjects(或子类)数组,该数组配置有User
实体的属性名称键。要查找userName
数组中每个托管对象的属性值,您可以向对象询问其属性值,如下所示:
NSString *aUserName=[aUserEntityObject valueForKey:@"userName"];
忘记你所知道的关于 SQL 或类似数据库系统的一切。Core Data 并不是一个真正的数据库,所以试图用这些术语来思考它只会让你感到困惑。Core Data 是关于对象的。
你的谓词很好,但你的问题表明你没有完全理解发生了什么。
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
}