我试图构建一个核心数据存储时,它们发生在较长的字符串来检索一个实体的属性值的查询;
即,而不是寻求其中的属性值包含 (短)字符串实例:
request.predicate = [NSPredicate predicateWithFormat:@"carBrand contains[c] 'merced'"]
我想找到(的实体)被发现“包含在”任意(长)字符串,它的属性值的实例:
NSString* textString = @"Elaine used to drive Audis, but now owns a Mercedes";
request.predicate = [NSPredicate predicateWithFormat:@"%@ contains[c] carBrand", textString ];
(即检索阵列保持与carBrand = @“奥迪”和carBrand = @“梅赛德斯”对象)
在我的努力,NSPredicate似乎并不喜欢在右手侧属性名称的表情和抛出一个错误...
[__NSCFConstantString countByEnumeratingWithState:对象:计数:]:无法识别的选择发送到实例0X
...有构建与左侧的属性名称,查询的方式-一个“contained_by”查询,因为它是?
PS。 搜索SO,我只发现通过拆分文本组件的话解决方案 ,在我的情况,就不太理想! 这是方法那是可行的唯一类型?
构建一个正则表达式字符串阵列,并且使用MATCHES
在你的谓语。
[NSPredicate predicateWithFormat:@"%@ MATCHES '*(Audi|Mercedes)*'", testString];
要根据自己的品牌筛选车:
NSArray *brands = [@"Audi", @"Mercedes"];
[NSPrediate predicateWithFormat:@"carBrand IN %@", brands];
决定尝试实施componentsSeparatedByString
的方法来建立一个NSCompoundPredicate
//find alphabetic words omitting standard plurals
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?:[^a-z]*)([a-z]+?)(?:s)?\\W+" options:NSRegularExpressionCaseInsensitive error:nil];
//separate with pipe| and split into array
NSString *split = [regex stringByReplacingMatchesInString:textString options:0 range:NSMakeRange(0, speciesString.length) withTemplate:@"$1|"];
NSArray *words = [split componentsSeparatedByString:@"|"];
//build predicate List
NSMutableArray *predicateList = [NSMutableArray array];
for (NSString *word in words) {
if ([word length] > 2) {
NSPredicate *pred = [NSPredicate predicateWithFormat:@"brandName beginswith[c] %@", word];
[predicateList addObject:pred];
}
}
//CarBrand* object;
NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"CarBrand" inManagedObjectContext:self.managedObjectContext];
request.predicate = [NSCompoundPredicate orPredicateWithSubpredicates:predicateList];
NSError *error =nil;
NSArray *results = [self.managedObjectContext executeFetchRequest:request error:&error];
这将检索在文本中发现的情况; 点拨:
@“伊莱恩用来驱动奥迪,但现在拥有一辆奔驰车”;
对象赋予其.brandname =“奥迪”,“奔驰”,分别的阵列。
EG2:@“在被盗汽车是福特蒙迪欧,菲亚特500C和阿尔法罗密欧的Spyder”
产量.brandname = “福特”, “菲亚特” 和 “阿尔法罗密欧”(NB没有 ' - ')分别。
我还没有接受我自己的答案,因为它似乎太多了一种变通方法,并不会轻易扩展到(例如)提取名牌,并说,模型。
希望有人将有一个更好的解决方案!