2012-04-10 15 views
6

मैं उन सभी श्रेणियों को कैसे ढूंढ सकता हूं जिनमें 1 से अधिक वस्तुओं वाले उपश्रेणियां हैं? मैं निम्नलिखित कोड का उपयोग कर रहा हूं, लेकिन मुझे "एकाधिक से कई कुंजियों की अनुमति नहीं है"।कई रिश्तों को एनएसपीडिकेट

मैं एक सबक्वेरी उपयोग करने की आवश्यकता है?

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Categories"]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY subcategories.items > 0"]; 
[request setPredicate:predicate]; 

मदद! :)

+0

NSCompoundPredicate के माध्यम से एकाधिक NSPredicates का उपयोग करें। https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Predicates/Articles/pCreating.html –

+0

'items' शायद एक सेट है, count' –

उत्तर

3

अपने NSPredicate में आप [email protected] >0 बजाय का उपयोग करना चाहिए।

Sorr, कि काम करेगा ही अगर श्रेणियों-उपश्रेणियाँ एक wer - एक के लिए।

वास्तव में, आप क्या करना चाहिए, हटाने सभी उपश्रेणियों जो कोई आइटम नहीं है, मुझे लगता है कि है।

tou से बस अगर कोई उपश्रेणियाँ हैं की जाँच करनी चाहिए और इसका मतलब होगा कि वे खाली नहीं हैं। [email protected] >0

+0

आपकी मदद के लिए धन्यवाद का उपयोग कर' @ प्रयास करें।'NSInvalidArgumentException' प्राप्त करना, कारण: 'असमर्थित फ़ंक्शन अभिव्यक्ति गणना: (subcategories.items)'। श्रेणी में उपश्रेणियों के लिए बहुत से संबंध हैं, और वस्तुओं के लिए कई रिश्तेदारों के साथ संबंध हैं। – Nimrod7

2

आप केवल एसक्यूएल बैकएंड में एक से कई रिश्तों का उपयोग कर सकते हैं। यह ऐसा करेगा, लेकिन आपको "बैक-लिंक" को ऑर्डर किए गए सेट में जोड़ना होगा (यदि आप सॉर्टिंग का उपयोग करते हैं तो ऑर्डर को सुरक्षित रखने के लिए - और विशिष्टता क्योंकि आप एक ही श्रेणी में वापस कई उपश्रेणियां प्राप्त कर सकते हैं)। सीमाओं पर विचार करते हुए आदर्श नहीं है, लेकिन बुरा नहीं है।

// Search for all subcategories with item count > 0 
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Subcategory"]; 
request.predicate = [NSPredicate predicateWithFormat:@"[email protected] > 0"]; 
NSError *error = nil; 
// They should have an inverse relationship to their category... 
// We have to iterate and insert them in to a set, but there is no additional 
// disk access. 
NSMutableOrderedSet *results = [NSMutableOrderedSet orderedSet]; 
[[self.projectDatabase.managedObjectContext executeFetchRequest:request error:&error] enumerateObjectsUsingBlock:^(Subcategory *obj, NSUInteger idx, BOOL *stop) { 
    [results addObject:obj.category]; 
}]; 

संपादित

दुर्भाग्य से, मुझे नहीं लगता कि इस एसक्यूएल दुकान के साथ संभव है है। सबसे पहले, मुझे तनाव दें कि मैं एसक्यूएल विशेषज्ञ के करीब कहीं भी नहीं हूं, और मैं आमतौर पर अपने कोरडाटा स्टोर्स को डिज़ाइन करने की कोशिश करता हूं ताकि इन प्रकार के प्रश्न जरूरी न हों। हालांकि, निम्न SUBQUERY एक इनमेमरी स्टोर के साथ काम करता है, इसलिए यह कुछ हद तक ठीक से स्वरूपित सबक्वायरी है।

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(subcategories, $s, [email protected] > 0)[email protected] > 0"]; 

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

कीपैथ जिसमें केवीसी कुल होता है जहां एक नहीं होना चाहिए; $ S.items संभाल करने विफल रहा है। @ गिनती

+0

बस एक अलग दृष्टिकोण की कोशिश करने के लिए चारों ओर मिल गया। क्या यह आपके लिए करता है? –

+0

हाँ, जो मैं उपयोग कर रहा हूं, लेकिन मैं डेटाबेस स्तर पर subquery या @count (यदि कोई तरीका है) के माध्यम से ऐसा करने के लिए देख रहा था। मुझे यकीन नहीं है कि अगर पुनरावृत्ति सबसे प्रभावी तरीका है। – Nimrod7

9

मेरे अनुभव के आधार पर, आप विधेय प्रारूप स्ट्रिंग

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY subcategories.items > 0"];  

में

@"ANY subcategories.items > 0" 

से

@"[email protected] > 0" 
में बदलना चाहिए

ध्यान दें कि कोई भी कुंजी rd को भी जाने की जरूरत है, या आप संपत्ति को गलत तरीके से पूछेंगे।

+0

जो उपश्रेणियों और वस्तुओं के सेट के बाद से एनएसआईएनवालिडअर्ग्यूमेंट अपवाद उठाता है। – Nimrod7

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