2011-06-08 17 views
24

हैलो को भविष्यवाणी के साथ मदद की ज़रूरत है। समस्या यह है कि मैं एक ऐसा फ़ंक्शन रखना चाहता हूं जो डेटाबेस से प्राप्त होगा, जो कई मानों पर निर्भर करता है, लेकिन मान हमेशा मौजूद नहीं होते हैं, क्या इसका मतलब है कि मुझे कई अलग-अलग भविष्यवाणियां बनाना है?एकाधिक पैरामीटर के साथ एनएसपी्रेडिकेट

नीचे

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"brand_id LIKE %@ AND brand_id LIKE %@ AND brand_id LIKE %@ AND brand_id LIKE %@ AND brand_id LIKE %@ AND item_category LIKE %@ AND item_make LIKE %@ AND item_gender LIKE %@ || item_price>%@ || item_price<%@", 
           brand_one, brand_two, brand_three, brand_four, brand_five, categoryString, makeString, genderString,[NSNumber numberWithInt:price_bottom],[NSNumber numberWithInt:price_top]]; 

brand_one, brand_two और आदि कोड कभी कभी मौजूद हैं और कभी कभी नहीं है।

और उदाहरण के लिए item_gender के लिए इसे कैसे होना चाहिए। चलो अगर उनमें से दोनों के मुकाबले कोई लिंग निर्दिष्ट नहीं है।

क्षमा करें अगर समस्या का मेरा विवरण भ्रमित हो रहा है। Gobras पर

बेस टिप्पणी निम्नलिखित कोड था

NSArray *brands = [NSArray arrayWithObjects:brand_one, brand_two, brand_three, brand_four, brand_five, nil]; 

    NSPredicate *predicate_brands = [NSPredicate predicateWithFormat:@"brand_id like %@" argumentArray:brands]; 

क्या क्या खोज समारोह की तार्किक व्याख्या का उत्पादन पर

  1. fetchrequest
  2. विधेय

विधेय आधारित लाने चाहिए अनुरोध 5 ब्रांड आईडी, आइटम आईडी, आइटम श्रेणी, आइटम बनाने, आइटम जी पर nder, यदि उपरोक्त में से कोई भी खाली है तो उसे सभी संबंधित प्रविष्टियों को प्राप्त करना चाहिए उदाहरण के लिए यदि आइटम श्रेणी खाली है तो उसे सभी "आभूषण, घड़ियां और आदि" प्राप्त करना चाहिए, लेकिन शेष अनुमानित अभिव्यक्तियों के साथ इसे सीमित करना चाहिए।

क्या मुझे उदाहरण के लिए ब्रांड्स के लिए यौगिक भविष्यवाणी करना चाहिए और आइटम श्रेणी के लिए "item_category जैसे आभूषण" और "item_category जैसे घड़ियां" के साथ एक और बनाने के लिए बनाना चाहिए और उसके बाद मैं उन्हें वास्तव में कैसे साथ लाऊं?

उत्तर

62

रूप

NSMutableArray *parr = [NSMutableArray array]; 
if([brand_one length]) { 
    [parr addObject:[NSPredicate predicateWithFormat:@"brand_id LIKE %@",myBrandId]]; 
} 
if([brand_two length]) { 
    // etc 
} 

NSPredicate *compoundpred = [NSCompoundPredicate andPredicateWithSubpredicates:parr]; 

में आप orPredicateWithSubpredicates: और andPredicateWithSubpredicates: और NSCompoundPredicate एक NSPredicate ही जटिल हो सकता है किया जा रहा है के साथ अपने विधेय टिके रहते हैं कर सकते हैं NSCompoundPredicate

में अलग-अलग विधेय के एक उचित संग्रह इकट्ठा।

https://developer.apple.com/documentation/foundation/nscompoundpredicate

+2

+1 यह जाने का रास्ता है। – TechZen

+0

thanx वॉरेन, मैं अभी भी अपने सिर में यह सही नहीं कर सकता, मुझे लगता है कि यह समझने के अपने स्तर पर है। मैं कुछ परीक्षण चलाता हूं और ऐसा लगता है कि मेरे पास अब तार्किक मुद्दे हैं ... अगर आप मेरी मदद कर सकते हैं तो वास्तव में सराहना करेंगे ... मैंने जो करना है, उसके बारे में तार्किक स्पष्टीकरण जोड़ा है ... –

+0

और मैं वास्तव में कैसे यौगिक predicate का उपयोग करें? cpred मूल्य मैं कहां उपयोग करता हूं, क्या यह [NSPredicate predicateWithFormat] में है? –

1

गतिशील रूप से पूर्वानुमान बनाने के लिए यह बहुत आसान है: अपनी अनुमानित प्रारूप स्ट्रिंग को वांछित संख्याओं के साथ संयोजित करें और तर्क के साथ संबंधित एनएसएमयूटेबलएरे बनाएं। [NSPredicate predicateWithFormat:argumentArray:] बाकी करेंगे।

+0

Thanx मैंने कोशिश की है लेकिन यह सही चीज़ नहीं लाती है। मैंने आपकी टिप्पणियों के आधार पर प्रश्न में उपर्युक्त कोड जोड़ा है कि यह कैसा दिखना चाहिए? अभी भी मेरे लिए कई ब्रांड नहीं लाता है। –

+0

अद्यतन कोड में आपके पास केवल एक शर्त है जबकि प्रत्येक वैध ब्रांड_ के लिए एक शर्त होनी चाहिए। @ वॉरेन बर्टन ने जटिल एनएसपीडिकेट को गतिशील रूप से बनाने के लिए थोड़ा और जटिल (लेकिन अभी तक अधिक उचित) तरीका के साथ लगभग एक ही दृष्टिकोण का सुझाव दिया। – Gobra

2

जो लोग स्विफ्ट में रुचि रखते हैं के लिए मिलते हैं!

let arrPred = [NSPredicate(format: "yourAttribute LIKE %@", toCompareID), NSPredicate(format: "yourAttribute2 LIKE %@", toCompareID2)] //Add as many predicates you want in short make your query 

let compoundpred:NSPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: arrPred) 
var arrFiltered = yourArray.filteredArrayUsingPredicate(compoundpred) 
संबंधित मुद्दे