2014-04-21 11 views
7

Örneğin, üç özelliğe sahip bir nesnem var: firstName, middleName, lastName.Bir nesnenin tüm özelliklerini karşılaştıran bir yüklem nasıl oluşturulur?

NSPredicate kullanarak tüm özelliklerde "john" dizesini aramak istiyorum.

yerine böyle bir yüklemi yaratma:

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

ben böyle bir şey yapabilir:

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

cevap

4

, bir yüklemi çalışmıyor "tümünü içeren" ve (bildiğim kadarıyla Bildiğim gibi) istenen sonucu elde etmek için benzer bir sözdizimi yoktur.

Aşağıdaki kod tüm "String" Bir "bileşik yüklemi" yaratan varlık öznitelikleri:

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

Eğer basit nsobject durumunda, tüm mülklerin isimlerini almak için mülk enumeratorını kullanabilirsiniz http://tny.cz/e4974e2b –

+2

@AbidHussain: Evet, ancak özellikleri sıralamak verecekti Ayrıca NSManagedObject veya NSObject öğesinden devralınan tüm özellikler. Bu yöntem, yalnızca varlık için tanımlanan öznitelikleri verir. –

0

Böyle bir yol gibi bunu yapabilir,

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

Ama düzeltmek olduğunu . :(dinamik değil :)