Iphone 从不在集合中的核心数据获取对象
我试图从核心数据中提取不在给定集合中的对象,但我无法使其工作 例如,假设我们有一个名为User的核心数据实体,它有一些属性,如userName、familyName、givenName和active。给定表示一组用户名的字符串数组,我们可以轻松获取与该用户名列表对应的所有用户:Iphone 从不在集合中的核心数据获取对象,iphone,objective-c,core-data,nspredicate,Iphone,Objective C,Core Data,Nspredicate,我试图从核心数据中提取不在给定集合中的对象,但我无法使其工作 例如,假设我们有一个名为User的核心数据实体,它有一些属性,如userName、familyName、givenName和active。给定表示一组用户名的字符串数组,我们可以轻松获取与该用户名列表对应的所有用户: NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init]; NSFetchRequest *request = [[NSFetchReques
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];
但是,我希望获取该集合的补码,也就是说,我希望核心数据中没有在用户名数组中指定用户名的所有用户。有人知道如何处理这个问题吗?我认为在谓词
中添加“NOT”
(即“userName NOT in%@”)
非常简单,但Xcode抛出一个异常,表示无法解析谓词格式。我还尝试使用谓词生成器来获取请求,但没有成功。文档也不是特别有用。建议?评论?感谢您的帮助:)要查找不在阵列中的对象,您只需执行以下操作:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (userName IN %@)", userNames];
这将返回一个对所有对象的请求,而不包括您指定的对象我对核心数据/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];
//...
下面是另一个有用的示例,演示如何获取字符串列表,并过滤掉任何不以字母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);
当我用a-Z索引填充
UITableView
时,我使用这种NSPredicate
,并希望为不以字母开头的项目设置“其他所有内容”部分。足够简单。。。谢谢,斯莱夫,太棒了。我以为它不起作用了。但这是因为我数组中的数据来自另一个字段。谢谢简单有效。注意:这不适用于NSNumber变量,这可能有意义,但如果将枚举包装到NSNumber中,则会很遗憾。在这种情况下,请使用类似于[nspreditate predicateWithFormat:@“NOT(enumWrapper In{%d,%d})”、enum1、enum2]
。不适用于我..:(尽管,[NSPredicate predicateWithFormat:@“userName IN%@”,但userNames]
可以完美地工作