Nspredicate 使用预先构建的字符串创建谓词
有没有一种方法可以直接从预格式化字符串创建nspredicate,而不调用predicateWithFormat?最后一个字符串类似于:Nspredicate 使用预先构建的字符串创建谓词,nspredicate,Nspredicate,有没有一种方法可以直接从预格式化字符串创建nspredicate,而不调用predicateWithFormat?最后一个字符串类似于: (住院病人=1)和(出院!=)和((主治=史密斯)或(入院=史密斯)或(咨询包含[cd]SMITH)或(主治=琼斯)或(入院=琼斯)或(咨询包含[cd]JONES)) 可以,但需要稍微修改格式字符串 而不是做: [preds appendFormat:@" (attending = %@)", prov]; 您需要执行以下操作: [preds appendF
(住院病人=1)和(出院!=)和((主治=史密斯)或(入院=史密斯)或(咨询包含[cd]SMITH)或(主治=琼斯)或(入院=琼斯)或(咨询包含[cd]JONES))
可以,但需要稍微修改格式字符串 而不是做:
[preds appendFormat:@" (attending = %@)", prov];
您需要执行以下操作:
[preds appendFormat:@" (attending = '%@')", prov];
注意在%@
修饰符周围使用单引号。谓词就是这样知道它是一个常量值的
然而,即使你走这条路,你仍然会被困在使用predicateWithFormat:
,这似乎是你想要避免的。在格式字符串中如何使用NSNull
也可能存在问题
我建议你做一些类似的事情:
NSArray *provs = [self.providerCode componentsSeparatedByString:@"|"];
NSMutableArray *providerPredicates = [NSMutableArray array];
NSPredicate *template = [NSPredicate predicateWithFormat:@"attending = $prov OR admitting = $prov OR consulting CONTAINS[cd] $prov"];
for (NSString *prov in provs) {
NSDictionary *substitutions = [NSDictionary dictionaryWithObject:prov forKey:@"prov"];
NSPredicate *p = [template predicateWithSubstitutionVariables:substitutions];
[providerPredicates addObject:p];
}
NSPredicate *final = [NSPredicate predicateWithFormat:@"inpatient = 1 AND dischargedate != nil"];
if ([providerPredicates count] > 0) {
NSPredicate *providers = nil;
if ([providerPredicates count] > 1) {
providers = [NSCompoundPredicate orPredicateWithSubpredicates:providerPredicates];
} else {
providers = [providerPredicates objectAtIndex:0];
}
final = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:final, providers, nil]];
}
这是使用两种不同的整洁方式:
@“Attenting=$prov或Incidenting=$prov或consulting CONTAINS[cd]$prov”
进行一次解析,然后每次使用不同的提供者时,只需用新值替换$prov
NSCompoundPredicate
上使用一些类方法将多个谓词转换为单个分组的或或和谓词
@user680891很高兴听到这个消息!要将我的答案标记为已接受,请单击向上/向下投票箭头下方的复选标记。
NSArray *provs = [self.providerCode componentsSeparatedByString:@"|"];
NSMutableArray *providerPredicates = [NSMutableArray array];
NSPredicate *template = [NSPredicate predicateWithFormat:@"attending = $prov OR admitting = $prov OR consulting CONTAINS[cd] $prov"];
for (NSString *prov in provs) {
NSDictionary *substitutions = [NSDictionary dictionaryWithObject:prov forKey:@"prov"];
NSPredicate *p = [template predicateWithSubstitutionVariables:substitutions];
[providerPredicates addObject:p];
}
NSPredicate *final = [NSPredicate predicateWithFormat:@"inpatient = 1 AND dischargedate != nil"];
if ([providerPredicates count] > 0) {
NSPredicate *providers = nil;
if ([providerPredicates count] > 1) {
providers = [NSCompoundPredicate orPredicateWithSubpredicates:providerPredicates];
} else {
providers = [providerPredicates objectAtIndex:0];
}
final = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:final, providers, nil]];
}