2014-04-21 19 views
7

Zum Beispiel habe ich ein Objekt, das drei Eigenschaften hat: firstName, middleName, lastName.Wie erstellt man ein Vergleichselement, das alle Eigenschaften eines Objekts vergleicht?

Wenn ich eine Zeichenfolge "John" in allen Eigenschaften mit NSPredate suchen möchten.

Statt ein Prädikat zu schaffen, wie:

[NSPredicate predicateWithFormat:@"(firstName contains[cd] %@) OR (lastName contains[cd] %@) OR (middleName contains[cd] %@)", @"john", @"john", @"john"];

Kann ich so etwas wie:

[NSPredicate predicateWithFormat:@"(all contains[cd] %@), @"john"];

Antwort

4

"enthält alle" nicht in einem Prädikat arbeiten, und (so weit wie ich weiß) gibt es keine ähnliche Syntax, um das gewünschte Ergebnis zu erhalten.

Der folgende Code erstellt eine "Verbindung Prädikat" von allen "String" Attribute in der Einheit:

NSString *searchText = @"john"; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity" inManagedObjectContext:context]; 
NSMutableArray *subPredicates = [NSMutableArray array]; 
for (NSAttributeDescription *attr in [entity properties]) { 
    if ([attr isKindOfClass:[NSAttributeDescription class]]) { 
     if ([attr attributeType] == NSStringAttributeType) { 
      NSPredicate *tmp = [NSPredicate predicateWithFormat:@"%K CONTAINS[cd] %@", [attr name], searchText]; 
      [subPredicates addObject:tmp]; 
     } 
    } 
} 
NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates]; 

NSLog(@"%@", predicate); 
// firstName CONTAINS[cd] "john" OR lastName CONTAINS[cd] "john" OR middleName CONTAINS[cd] "john" 
+0

für den Fall, dass Sie einfach nsobject haben, dann können Sie Eigenschaften-Enumerator verwenden, um Namen aller Eigenschaften zu erhalten http://tny.cz/e4974e2b –

+2

@AbidHussain: Ja, aber Aufzählung der Eigenschaften würde geben außerdem alle Eigenschaften, die von NSManagedObject oder NSObject geerbt werden. Diese Methode gibt nur die für die Entität definierten Attribute an. –

0

Sie können es in einer solchen Art und Weise tun, wie,

NSMutableArray *allTheContaint = [[NSMutableArray alloc] init]; 
[allTheContaint addObject:allTheContaint.firstName]; 
[allTheContaint addObject:allTheContaint.middleName]; 
[allTheContaint addObject:allTheContaint.lastName]; 

NSPredicate *predicateProduct = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", @"john"]; 
NSArray *filteredArray = [self.listOfProducts filteredArrayUsingPredicate:predicateProduct]; 
NSLog(@"%@", filteredArray); 

Aber es ist fix . :(nicht für dynamische :)