我有一个名为 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,甚至不知道要搜索的条件。
感谢任何帮助!
答案 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"];
哪个应该发表如下声明: