【问题标题】:Fetch from core data where value contains string从值包含字符串的核心数据中获取
【发布时间】:2017-01-13 09:21:33
【问题描述】:

我有一个名为 Forms 的核心数据表,其中包含一个名为 objectids 的属性,该属性包含一个带有 id 的逗号分隔字符串。 (它也可以只包含一个 id) 例如。

objectids = "90"          // one id
objectids = "91,23,44"    // multiple ids

我收到一个 objectid,我想匹配它并查看它是否作为值存在于任何 Forms -> objectids 条目中。

重要的是它只匹配整个字符串。 IE。 objectid1 不应与 objectids91、23、44 等匹配

这是我的代码的 sn-p。

-(NSDictionary*)readForm:(NSString*)objectid
{

  ...

  NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
  NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Forms"];
  NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"added_date" ascending:NO];
  [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
  [fetchRequest setReturnsObjectsAsFaults:NO];
  fetchRequest.predicate = [NSPredicate predicateWithFormat:@"userid == %@ AND objectids == %@ AND active == %@", user.userid, objectid, @"yes"];

  // *** in this fetchRequest I want to include some snippet of code to:
  // *** Match string, but only whole string seperated by commas, unless it only has one value in which case it contains no commas.

  NSError *err = nil;
  NSArray *results = [managedObjectContext executeFetchRequest:fetchRequest error:&err];
  if([results count])
  {    
    ...
  }
}

我希望它是可以理解的。

我对目标 C 的了解还不够,甚至不知道要搜索什么术语。

感谢任何帮助!

【问题讨论】:

  • 澄清一下,在查找“1”时,您是要匹配“22,1,5”,还是只匹配“1”? I. E. 您是否要在条目中的列表中查找单个项目,但不是部分匹配的项目?还是这个列表更像是一个 IP 地址,您只想匹配整个列表?
  • 是的,抱歉,如果 objectids = "22,1,5" 我希望 "1" 匹配,(也匹配 "22" 或 "5")
  • objectid 是什么?如果它们与您的 CoreData 存储中的其他对象相关,那么听起来您需要考虑一对多关系,而不是使用单个字符串属性来保存多个引用。
  • 这有点难以解释,因为它有一个完整的后端。但它们与其他核心数据无关。他们的全部目的是检查我在这个函数中收到的值是否存在于 objectids 中。它们在任何其他方面都不“聪明”。
  • @A.Daleby 在这种情况下,下面 ChiellieNL 的答案的变体应该可以解决问题。

标签: ios objective-c xcode core-data


【解决方案1】:

对于字符串比较,您可以使用 LIKE 代替 ==,并且对于您的布尔值,使用文字 @YES,因此您的谓词是:

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"userid == %@ AND objectids LIKE %@ AND active == %@", user.userid, objectid, @YES];

对于更复杂的字符串比较,您可以使用 predicateWithBlock:

编辑:阅读您进一步的 cmets,我认为这个问题使用正则表达式回答了完全相同的问题:Form NSPredicate from string that contains id's

【讨论】:

  • 我点击了您提供的链接。使用正则表达式有效。
【解决方案2】:

考虑你的例子:

objectids = "90"          // one id
objectids = "91,23,44"    // multiple ids

如果只有 1 个 id,您可以比较完整的字符串。如果有更多的 id,它们总是在逗号之前或之后。

也许你可以使用这样的东西:

NSString *first = [NSString stringWithFormat:@"%@,%%", objectid];
NSString *last = [NSString stringWithFormat:@"%%,%@", objectid];
NSString *inBetween = [NSString stringWithFormat:@"%%,%@,%%", objectid];

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"userid == %@ AND (objectids == %@ OR objectids LIKE %@ OR objectids LIKE %@ OR objectids LIKE %@) AND active == %@", user.userid, objectid, first, last, inBetween, @"yes"];

应该这样声明:

  • objectids 正好是“90”或
  • objectids 以“90”开头,或者
  • objectids 以“,90”或结尾
  • objectids 包含“,90”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多