编写“CONTAINED_BY”文本查询的NSPredicate

我试图构造一个核心数据存储的查询检索实体的属性值,当他们发生在更长的string;

即,而不是寻找属性值包含 (较短)string的实例:

request.predicate = [NSPredicate predicateWithFormat:@"carBrand contains[c] 'merced'"] 

我想find属性值(包含在一个任意(更长)的string中)的实例(的实体):

 NSString* textString = @"Elaine used to drive Audis, but now owns a Mercedes"; request.predicate = [NSPredicate predicateWithFormat:@"%@ contains[c] carBrand", textString ]; 

(即检索carBrand = @“Audi”和carBrand = @“Mercedes”的数组存储对象)

在我的尝试中,NSPredicate似乎不喜欢右侧属性名称的expression式,并引发错误…

[__NSCFConstantString countByEnumeratingWithState:objects:count:]:无法识别的select器发送到实例0x

有没有一种方法来构build这样一个查询,在左侧的属性名称 – 一个“contained_by”查询,因为它是?

PS 。 在search中,我只find解决scheme,将文本分解成组成单词 ,在我的情况下,将不太理想! 这是唯一可行的方法吗?

用你的数组构造一个正则expression式string,并在你的谓词中使用MATCHES

 [NSPredicate predicateWithFormat:@"%@ MATCHES '*(Audi|Mercedes)*'", testString]; 

要根据品牌过滤汽车:

 NSArray *brands = [@"Audi", @"Mercedes"]; [NSPrediate predicateWithFormat:@"carBrand IN %@", brands]; 

决定尝试实施componentsSeparatedByString方法来构buildNSCompoundPredicate

 //find alphabetic words omitting standard plurals NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?:[^az]*)([az]+?)(?: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]; 

这将检索在文本中find的实例; 点拨:

@“伊莱恩曾经驾驶奥迪斯,但现在拥有一辆梅赛德斯”;

给出品牌名称分别为.brandname =“Audi”,“Mercedes”的对象。

eg2:“在被盗的车辆中有福特蒙迪欧,菲亚特500C和阿尔法 – 罗密欧Spyder”

.brandname =“Ford”,“Fiat”和“Alfa Romeo”(NB no' – ')。

我还没有接受我自己的答案,因为它似乎太多的解决方法,不会轻易扩展(例如)提取品牌名称,例如,模型。

希望有人会有更好的解决scheme!