2011-05-11 2 views
0

Existe-t-il un moyen de créer une nspredicate directement à partir d'une chaîne préformatée sans appeler predicateWithFormat? La chaîne finale ressemblerait à quelque chose comme:Création d'un prédicat avec une chaîne préconfigurée

(inpatient=1) AND (dischargedate!=<null>) AND ((attending=SMITH) OR (admitting=SMITH) OR (consulting contains[cd] SMITH) OR (attending=JONES) OR (admitting=JONES) OR (consulting contains[cd] JONES))

NSMutableString *preds = [[NSMutableString alloc] initWithString:@""]; 

    NSArray *provs = [self.providerCode componentsSeparatedByString:@"|"]; 
    for (NSString *prov in provs) { 
     [preds appendFormat:@" (attending=%@) OR (admitting=%@) OR (consulting contains[cd] %@) ", prov, prov, prov]; 
    } 
    NSString *final = [NSString stringWithFormat:@"(inpatient=%@) AND (dischargedate!=%@) AND (%@)", [NSNumber numberWithBool: self.inpatients], [NSNull null], preds]; 

    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:final]]; 

Répondre

0

Oui vous pouvez, mais vous devez modifier légèrement la chaîne de format.

Au lieu de faire:

[preds appendFormat:@" (attending = %@)", prov]; 

Vous auriez besoin de le faire:

[preds appendFormat:@" (attending = '%@')", prov]; 

Notez l'utilisation des guillemets simples autour du modificateur %@. C'est ainsi que le prédicat sait que c'est une valeur constante.

Cependant, même si vous suivez cette route, vous êtes toujours bloqué en utilisant predicateWithFormat:, ce que vous semblez vouloir éviter. Vous aurez probablement des problèmes avec la façon dont vous utilisez NSNull dans la chaîne de format.

Je recommande de faire quelque chose comme ceci:

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]]; 
} 

Ce utilise un couple de choses différentes soignées:

  1. variables prédicats. Vous analysez la chaîne de format @"attending = $prov OR admitting = $prov OR consulting CONTAINS[cd] $prov" une seule fois, puis remplacez simplement par de nouvelles valeurs pour $prov chaque fois que vous avez un fournisseur différent
  2. Construire des prédicats composés. Vous utilisez des méthodes de classe sur NSCompoundPredicate pour transformer plusieurs prédicats en un seul prédicat groupé OR ou AND.
+0

Merci dave ... Votre solution a bien fonctionné !! – user680891

+0

@ user680891 content de l'entendre! Pour marquer ma réponse comme acceptée, cliquez sur la coche sous les flèches de haut/bas. –

Questions connexes