【问题标题】:Form NSPredicate from string that contains id's从包含 id 的字符串形成 NSPredicate
【发布时间】:2013-02-02 15:57:22
【问题描述】:

我有这个问题,我想不出如何写这个谓词。

我有一个名为 Contact 的实体,假设它有一个字符串属性“pages”

contact.pages = @"1,5,11,15,17";

我的数据库中有很多联系人,我只想获取这些包含特定 ID 的联系人。所以假设我只想获取这些联系人,哪些页面包含 id @"1"。

我能想到这样的事情,

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"self.pages CONTAINS %@", _pageId];

但我的问题是这也会获得联系人,例如有 pages = @"11,15"。

那么关于如何实现这一目标的任何想法? 如有任何建议,我将不胜感激,在此先感谢!

【问题讨论】:

  • 实际上这个字符串是这样形成的,我有一个 id 数组,我用:[idArray componentsJoinedByString:@","];所以如果我的 id 在最后一个位置,这是行不通的,是吗?编辑:或者如果这个字符串只有一个对象,它也不会工作
  • 你可以使用数组的值并按 ids 而不是按页面过滤吗?
  • 好吧,我真的不知道,这些所谓的页面实际上是其他 coreData 实体的 id。我还有一个名为 page 的实体。这些联系人属于多个页面。此联系人所属页面的列表以逗号分隔的字符串形式显示。我有办法实现这一点,通过所有联系人,并将这个字符串分成一个数组,但这需要很长时间,我想通过使用谓词来实现。

标签: ios objective-c core-data nspredicate nsfetchrequest


【解决方案1】:

NSPredicate 的“MATCHES”运算符可用于与正则表达式进行比较:

NSString *pageId = @"1";
NSString *regex = [NSString stringWithFormat:@"(.*,)?%@(,.*)?", pageId];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"pages MATCHES %@", regex];

但您还应该考虑将字符串属性替换为与 Page 实体的一对多关系,然后谓词看起来像

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY pages.pageid == %@", pageId];

【讨论】:

  • 超级!!正是我想要的!帮了我很大的忙。祝你好运
  • 嗨@Martin R 惊人的答案!你能详细说明你使用的正则表达式吗,谢谢。
猜你喜欢
  • 2013-01-14
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 2022-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多