3

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

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

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

4

2 回答 2

5

让我从这个建议开始。核心数据不是 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 是关于对象的。

于 2011-04-04T20:43:16.980 回答
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
}
于 2014-12-12T10:15:44.467 回答