我正在尝试从不在给定集合中的核心数据中获取对象,但我无法让它工作。
例如,假设我们有一个名为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会抛出异常,说明无法解析谓词格式。我还尝试使用可用于获取请求的谓词构建器而没有运气。文档也没有特别的帮助。建议?评论?谢谢你的帮助:)
答案 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
,并且对于不以字母开头的项目需要“其他所有”部分。