2011-02-14 17 views
10

मेरे आईओएस एप्लिकेशन में मेरे पास मेरे fetch नियंत्रक के लिए वास्तव में एक साधारण अनुमान है।बहु-शब्द खोज के लिए एनएसपी्रेडिकेट

NSString *format = [NSString stringWithFormat:@"name like[c] '%@'", nameVar]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:format]; 
[fetchController setPredicate:predicate]; 

यह मूल केस-असंवेदनशील नाम लुकअप करता है। अब मैं इसे बदलना चाहता हूं ताकि मैं खोज बॉक्स में कई शब्द डाल सकूं (नाम वार के पास खोज बॉक्स से मूल्य है) रिक्त स्थान से अलग हो और अनुमानित फ़िल्टर उन सभी कीवर्ड से मेल खाने वाले परिणामों को फ़िल्टर करें।

तो यदि मेरे पास दो नाम हैं: "जॉन स्मिथ" और "मैरी स्मिथ" और मैं खोजता हूं: "स्मिथ एम" मैं केवल एक परिणाम चाहता हूं लेकिन इस तरह की एक खोज: "एसएम थथ" दोनों मूल्यों को वापस करें।

क्या किसी को पता है कि इसे कैसे कार्यान्वित किया जाना चाहिए?

उत्तर

31

संपादित एक नियमित रूप से कंप्यूटर पर वापस ...

तो नीचे दिए कुछ के बारे में पता होना करने के लिए देखते हैं: आप में प्रतिस्थापन प्लेसहोल्डर के आसपास उद्धरण डाल करने के लिए की जरूरत नहीं है

  1. अपने प्रारूप स्ट्रिंग। जब विधि भविष्यवाणी कर रही है, तो यह NSExpression और NSPredicate (विशेष रूप से NSComparisonPredicate और NSCompoundPredicate) वस्तुओं का एक सार वाक्यविन्यास पेड़ बनाने जा रहा है। आपकी स्ट्रिंग को NSExpression में NSConstantValueExpressionType टाइप किया जाएगा, जिसका अर्थ है कि यह पहले से ही नियमित स्ट्रिंग के रूप में व्याख्या किया जा रहा है। प्रारूप स्ट्रिंग में एकल कोट्स रखने से, वास्तव में, आपके पूर्वानुमान को गैर-कार्यात्मक बना दिया जाएगा।
  2. आप भविष्यवाणी में एक ही तुलना तक सीमित नहीं हैं। इसकी आवाज़ से, आप अपनी खोज स्ट्रिंग में "शब्द" के रूप में कई तुलना करना चाहते हैं (nameVar)। उस स्थिति में, हम nameVar को अपने घटक शब्दों में विभाजित करेंगे, और प्रत्येक शब्द के लिए तुलना बनाएंगे। एक बार ऐसा करने के बाद, हम AND एक साथ एक एकल अतिव्यापी भविष्यवाणी बनाने के लिए एक साथ मिलते हैं। नीचे दिया गया कोड बिल्कुल ठीक है।

मूल जवाब

आप अपनी खुद की NSCompoundPredicate का निर्माण करके ऐसा कर सकते हैं:

NSString *nameVar = ...; //ex: smith m 
NSArray *names = ...; //ex: John Smith, Mary Smith 

NSArray *terms = [nameVar componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
NSMutableArray *subpredicates = [NSMutableArray array]; 

for(NSString *term in terms) { 
    if([term length] == 0) { continue; } 
    NSPredicate *p = [NSPredicate predicateWithFormat:@"name contains[cd] %@", term]; 
    [subpredicates addObject:p]; 
} 

NSPredicate *filter = [NSCompoundPredicate andPredicateWithSubpredicates:subpredicates]; 
[fetchController setPredicate:filter]; 

चेतावनी: मेरे iPhone पर एक ब्राउज़र में टाइप किया है।

+0

तो, इस कोड को चलाने के बाद, मैं अपने परिणाम कहां पा सकता हूं? subpredicates? मैं आईओएस देव में शुरुआती हूं, माफ करना अगर सवाल बेवकूफ है :) –

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