写一个NSPredicate为“CONTAINED_BY”文本查询(Writing an NSPre

2019-10-21 06:12发布

我试图构建一个核心数据存储时,它们发生在较长的字符串来检索一个实体的属性值的查询;

即,而不是寻求其中的属性值包含 (短)字符串实例:

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,我只发现通过拆分文本组件的话解决方案 ,在我的情况,就不太理想! 这是方法那是可行的唯一类型?

Answer 1:

构建一个正则表达式字符串阵列,并且使用MATCHES在你的谓语。

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

要根据自己的品牌筛选车:

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


Answer 2:

决定尝试实施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没有 ' - ')分别。

我还没有接受我自己的答案,因为它似乎太多了一种变通方法,并不会轻易扩展到(例如)提取名牌,并说,模型。

希望有人将有一个更好的解决方案!



文章来源: Writing an NSPredicate for 'CONTAINED_BY' text query