从核心数据中获取值,其中value包含字符串

时间:2017-01-13 09:21:33

标签: ios objective-c xcode core-data

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

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

我收到 objectid ,我希望与之匹配并查看它是否作为任何表单中的值存在 - > objectids 条目。

重要的是它只匹配整个字符串。即。 objectid 1 不应与 objectids 匹配: 91,23,44 等。

以下是我的代码片段。

-(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,甚至不知道要搜索的条件。

感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

对于字符串比较,您可以使用LIKE而不是==,而且,对于您的bool,使用文字@YES,因此您的谓词将是:

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

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

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

答案 1 :(得分:1)

考虑你的例子:

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,”