【问题标题】:NSPredicate query for not containing a specific stringNSPredicate 查询不包含特定字符串
【发布时间】:2012-09-14 02:50:16
【问题描述】:

为这个寻找高低,但找不到我的答案。我正在寻找不等于指定字符串的所有记录的核心数据。例如,所有不等于当前会话 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]];

没有任何作用。HEEEEELP!!! -------------------------------------------------- --- 更多代码

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];

【问题讨论】:

  • 你能提供一个完整的方法吗?可能是您获取空数据。

标签: ios core-data nspredicate


【解决方案1】:

你的第一个谓词

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"listingID != %@", sessionID];

应该能找到属性listingID不等于sessionID的所有记录(前提是listingIDsessionID具有相同的类型)。

如果两者都是字符串,并且您想查找所有记录,其中listingID 不包含字符串sessionID 作为子字符串,那么这个谓词应该有效:

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

如果字符串比较应该不区分大小写和变音符号,请使用“CONTAINS[cd]”。

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

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

【讨论】:

  • 哎呀!那成功了。快速的问题,除非我失明,否则我没有在 Apple Predicate Programming Guide 中阅读您的解决方案。我在指南中错过了它还是在其他地方有介绍? (要求将来参考)
  • @sangony:当我开始使用 Core Data 编程时,我在谓词方面也遇到了困难,Predicate Programming Guide 可以更详细。有时很难以正确的顺序组合所有可能的比较、操作和谓词。您可以说所有内容都在“可可谓词的 BNF 定义”中进行了说明:-) - 我从 SO 阅读其他人的问题和答案中学到了很多东西。
  • 这很有帮助,但有没有办法将“不包含”运算符添加到 NSPredicateEditorRowTemplate?有NSContainsPredicateOperatorType,但没有NSDoesNotContainPredicateOperatorType(除非我错过了)。
  • @Jon:我不知道。通常我使用predicateWithFormat 并且很少以编程方式构建谓词。我假设有一些方法可以否定一个表达式...
  • @MartinR 我通过使用自定义NSPredicateEditorRowTemplate 解决了这个问题。自定义类覆盖templateViews 方法并设置自定义弹出窗口来处理“包含”和“不包含”运算符。然后,在setPredicate: 方法中,它设置它的(或超级的)谓词。相反,它解析传入的谓词格式并将运算符 & 右侧表达式保存到 ivars。然后,在predicateWithSubpredicates: 方法中创建一个新谓词,如果它是“不包含”运算符,则返回NSCompoundPredicate notPredicateWithSubpredicate 谓词。
猜你喜欢
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 2016-12-24
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 2023-04-10
相关资源
最近更新 更多