2010-10-17 16 views
10

मुझे डेटा के कई टुकड़ों के साथ NSPredicate बनाने की आवश्यकता है।एक जटिल NSCompoundPredicate बनाने का सबसे अच्छा तरीका क्या है?

SELECT * 
    FROM TRANSACTIONS 
    WHERE CATEGORY IN (categoryList) 
    AND LOCATION IN (locationList) 
    AND TYPE IN (typeList) 
    AND NOTE contains[cd] "some text" 
    AND DATE >= fromDate 
    AND DATE <+ toDate 

मैं कैसे कोर डेटा के साथ उपयोग के लिए एक NSPredicate के रूप में इस का निर्माण करने के साथ संघर्ष कर रहा हूँ: एसक्यूएल में उदाहरण के लिए मैं निम्नलिखित की तरह कुछ करना होगा। मैंने प्रलेखन पढ़ा है ... जो केवल सरल उदाहरण प्रदान करता है। अगर कोई मुझे एक और जटिल उदाहरण के लिए इंगित कर सकता है तो मैं निश्चित रूप से इसकी सराहना करता हूं।


ठीक है, मेरे पास दो साल तक जवाब था कि बहुत से लोगों को मदद मिली। मेरी पोस्ट हटा दी गई थी। समाधान के साथ अद्यतन यूआरएल यहाँ है।

https://www.radeeccles.com/convert-sql-statement-to-an-nspredicate-for-use-with-core-data/

+0

क्या आपने भविष्य में अपने खंड को इनपुट करने का प्रयास किया था। इसमें स्ट्रिंग से एक बनाने का एक तरीका है जो बहुत शक्तिशाली है। –

+0

मुझे किसी भी स्थान से अवगत नहीं है जो मुझे एक SQL कथन निर्दिष्ट करने देता है जो एक अनुमान उत्पन्न करता है। कृपया सलाह दें। – radesix

+0

मुझे नहीं पता कि मेरी पोस्ट क्यों हटाई जा रही है। इस लेख ने कई लोगों की मदद की है http://www.radeeccles.com/convert-sql-statement-to-an-nspredicate-for-use-with-core-data/ – radesix

उत्तर

9

आप क्या करने की जरूरत अपने खंड में से हर एक के लिए एक विधेय तैयार करना है। उदाहरण के लिए की आपकी क्वेरी को तोड़ने करते हैं:

  1. चुनें * लेनदेन से
  2. कहां (categoryList)
  3. और स्थान (locationList)
  4. में और प्रकार (typeList)
  5. और नोट श्रेणी में [सीडी] "कुछ पाठ"
  6. और दिनांक> = fromDate और दिनांक शामिल < + todate

इस पर आधारित, आपके पास 5 भविष्यवाणी (2-6) हैं। तो आइए उन पर एक-एक करके काम करें।

NSPredicate *inCategoryPredicate = [NSPredicate predicateWithFormat:@"Category IN %@", categoryList]; 

NSPredicate *locationPredicate = [NSPredicate predicateWithFormat:@"Location IN %@", locationList]; 

NSPredicate *typePredicate = [NSPredicate predicateWithFormat:@"Type IN %@", typeList]; 

NSPredicate *notePredicate = [NSPredicate predicateWithFormat:@"Note contains[c] %@", @"Some Text"]; 

NSPredicate *startDatePredicate = [NSPredicate predicateWithFormat:@"Date => @", fromDate]; 

NSPredicate *endDatePredicate = [NSPredicate predicateWithFormat:@"Date <= @", toDate]; 

अब तुम सिर्फ उन्हें सिर्फ एक विधेय में शामिल होने की आवश्यकता: Apple's documentation states:

आप संरचना चाहिए यौगिक किए गए कार्य की मात्रा को कम करने predicates। विशेष रूप से नियमित अभिव्यक्ति मिलान एक महंगा ऑपरेशन है। एक यौगिक भविष्यवाणी में, इसलिए आपको नियमित अभिव्यक्ति से पहले सरल परीक्षण करना चाहिए;

यह कहा जा रहा है कि आपको पहले "आसान" भविष्यवाणियों से शुरू करना चाहिए। तो:

NSCompoundPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects: startDatePredicate, endDatePredicate, inCategoryPredicate, locationPredicate, typePredicate, notePredicate]; 

तुम हमेशा क्या विधेय की एक विचार (एसक्यूएल जहां) प्राप्त कर सकते हैं की तरह अगर आप इसे NSLog लग रहा है।

+0

क्या यह [इस प्रश्न] का उत्तर देना संभव है (https : //stackoverflow.com/questions/46388393/create-complicated-nscompoundpredicate-in-swift-3) कृपया? –

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