2014-04-21 16 views
7

Na przykład mam obiekt, który ma trzy właściwości: firstName, middleName, lastName.Jak utworzyć predykat, który porównuje wszystkie właściwości obiektu?

Jeśli chcę wyszukać ciąg "john" we wszystkich właściwościach przy użyciu NSPredicate.

Zamiast tworzyć predykat jak:

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

Czy mogę zrobić coś takiego:

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

Odpowiedz

4

"wszystko zawiera" nie działa w orzecznika, a (o ile jak wiem) nie ma podobnej składni, aby uzyskać pożądany rezultat.

Poniższy kod tworzy „związek predykat” z wszystkimi „string” atrybuty w jednostce:

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

jeśli masz prosty nsobject, możesz użyć wylicznika właściwości, aby uzyskać nazwy wszystkich właściwości http://tny.cz/e4974e2b –

+2

@AbidHussain: Tak, ale wyliczenie właściwości dałoby także wszystkie właściwości dziedziczone z NSManagedObject lub NSObject. Ta metoda podaje tylko atrybuty zdefiniowane dla encji. –

0

można to zrobić w taki sposób, jak,

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); 

Ale to naprawić . :(nie dla dynamicznego :)