2014-04-21 6 views
7

उदाहरण के लिए, मेरे पास एक ऑब्जेक्ट है जिसमें तीन गुण हैं: firstName, middleName, lastName।किसी ऑब्जेक्ट की सभी गुणों की तुलना करने वाली भविष्यवाणी कैसे बनाएं?

यदि मैं एनएसपी्रेडिकेट का उपयोग कर सभी गुणों में एक स्ट्रिंग "जॉन" खोजना चाहता हूं।

इसके बजाय की तरह एक विधेय बनाने की:

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

मैं की तरह कुछ कर सकते हैं:

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

उत्तर

4

, एक विधेय में काम नहीं करता "सभी शामिल है" और (जहां तक जैसा कि मुझे पता है) वांछित परिणाम प्राप्त करने के लिए कोई समान वाक्यविन्यास नहीं है।

निम्नलिखित कोड सभी "स्ट्रिंग" से एक "यौगिक विधेय" बनाता है इकाई में जिम्मेदार बताते हैं:

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

यदि आपके पास सरल nsobject है तो आप सभी गुणों के नाम प्राप्त करने के लिए संपत्ति गणनाकर्ता का उपयोग कर सकते हैं http://tny.cz/e4974e2b –

+2

@AbidHussain: हाँ, लेकिन गुणों का आकलन करने से NSManagedObject या NSObject से विरासत में प्राप्त सभी गुण भी। यह विधि केवल इकाई के लिए परिभाषित गुण देता है। –

0

आप इस तरह के रास्ते की तरह में यह कर सकते हैं,

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

लेकिन इसे ठीक है । :(गतिशील के लिए नहीं :)

संबंधित मुद्दे