从不在集合中的核心数据中获取对象

时间:2011-05-31 00:58:42

标签: iphone objective-c core-data nspredicate

我正在尝试从不在给定集合中的核心数据中获取对象,但我无法让它工作。

例如,假设我们有一个名为User的核心数据实体,它具有一些属性,例如userName,familyName,givenName和active。给定一组代表一组用户名的字符串,我们可以轻松获取与该用户名列表对应的所有用户:

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"User"
                                          inManagedObjectContext:moc];
[request setEntity:entity];

NSArray *userNames = [NSArray arrayWithObjects:@"user1", @"user2", @"user3", nil];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"userName IN %@", userNames];
[request setPredicate:predicate];
NSArray *users = [moc executeFetchRequest:request error:nil];

但是,我想获取该集的补充,即,我希望核心数据中的所有用户都没有在userNames数组中指定的用户名。有谁知道如何处理这个问题?我认为在谓词"NOT"中添加(i.e., "userName NOT IN %@")会很简单,但Xcode会抛出异常,说明无法解析谓词格式。我还尝试使用可用于获取请求的谓词构建器而没有运气。文档也没有特别的帮助。建议?评论?谢谢你的帮助:)

3 个答案:

答案 0 :(得分:57)

为了找到不在你的数组中的对象,你所要做的就是这样:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (userName IN %@)", userNames];

那应该返回所有对象的请求而没有你指定的对象

答案 1 :(得分:1)

我对核心数据/ objective-c不够强,但谓词应该像下面的陈述一样;

[predicateFormat appendFormat:@"not (some_field_name in {'A','B','B','C'})"];

一个例子:

NSMutableString * mutableStr = [[NSMutableString alloc] init];

//prepare filter statement
for (SomeEntity * e in self.someArray) {
    [mutableStr appendFormat:@"'%@',", e.key];
}

//excluded objects exist
if (![mutableStr isEqual:@""])
{
    //remove last comma from mutable string
    mutableStr = [[mutableStr substringToIndex:mutableStr.length-1] copy];

    [predicateFormat appendFormat:@"not (key in {%@})", mutableStr];
}

//...
//use this predicate in NSFetchRequest
//fetchRequest.predicate = [NSPredicate predicateWithFormat:predicateFormat];
//...   

答案 2 :(得分:0)

这是另一个有用的例子,展示了如何获取字符串列表,并过滤掉任何不以字母A-Z开头的字符串:

NSArray* listOfCompanies = [NSArray arrayWithObjects:@"123 Hello", @"-30'c in Norway", @"ABC Ltd", @"British Rail", @"Daily Mail" @"Zylophones Inc.", nil];

NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"NOT (SELF MATCHES[c] '^[A-Za-z].*')"];

NSArray *filteredList = [listOfCompanies filteredArrayUsingPredicate:bPredicate];

for (NSString* oneCompany in filteredList)
    NSLog(@"%@", oneCompany);

当我使用AZ索引填充NSPredicate时,我使用这种UITableView,并且对于不以字母开头的项目需要“其他所有”部分。