NSPredicate查询不包含特定字符串

46

我四处搜寻,但找不到答案。我想查询Core Data中所有不等于指定字符串的记录,例如,所有不等于当前会话ID的记录。我尝试过以下方法,但都无法实现:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"listingID != %@", [sitListingID objectAtIndex:i]];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ NOT CONTAINS[cd] %@",@"listingID", [sitListingID objectAtIndex:i]];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ NOT CONTAINS %@",@"listingID", [sitListingID objectAtIndex:i]];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"listingID NOT like %@", [sitListingID objectAtIndex:i]];

什么都不起作用,救命啊!!! ----------------------------------------------------- 更多代码

NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"ListingRecord" inManagedObjectContext:context];
    [request setEntity:entity];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"sessionID <> %@", uniqueSessionListings];
    [request setPredicate:predicate];
    NSError *error = nil;
    NSMutableArray *mutableFetchResults = [[context executeFetchRequest:request error:&error] mutableCopy];

你能提供一个完整的方法吗?可能你获取了空数据。 - NeverBe
1个回答

123

您的第一个谓词

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"listingID != %@", sessionID];
应该能够找到所有记录,其中属性listingID不等于sessionID(假设listingIDsessionID具有相同的类型)。
如果两者都是字符串,并且您想要查找所有不包含字符串sessionID作为子字符串的listingID的记录,则应使用以下谓词:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (listingID CONTAINS %@)", sessionID];

如果字符串比较不区分大小写和音符号,则使用"CONTAINS[cd]"。

注意:您可以将属性名称指定为参数,但然后必须使用%K而不是%@作为格式:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (%K CONTAINS %@)", @"listingID", sessionID];

1
太棒了!这就解决了问题。顺便问一下,除非我眼花了,我在苹果谓词编程指南中没有看到你的解决方案。我是错过了还是其他地方有涉及?(为了以后参考而问) - sangony
3
@sangony:当我开始学习Core Data编程时,我也遇到了谓词的困难,谓词编程指南可能需要更详细。有时将所有可能的比较、操作和谓词正确地组合起来是很棘手的。你可以说“Cocoa谓词的BNF定义中已经包含了一切” :-) - 我通过阅读其他人在SO上的问题和答案而学到了很多。 - Martin R
2
这很有帮助,但是有没有一种方法可以向 NSPredicateEditorRowTemplate 添加一个“不包含”运算符?虽然有 NSContainsPredicateOperatorType,但没有 NSDoesNotContainPredicateOperatorType(除非我错过了)。 - Jon
@MartinR 这里的 "%k 包含 %@" 需要加括号吗? - pnizzle
@HimanshuMoradiya: let predicate = NSPredicate(format: "...", ...) - 格式字符串与Objective-C中相同。 - Martin R
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接