2011-08-09 20 views
28

के विशिष्ट मान प्राप्त करता है मैं किसी इकाई में किसी विशेष विशेषता के लिए अद्वितीय मान पुनर्प्राप्त करने के लिए अपने डेटा को NSFetchRequest सेट करने का प्रयास कर रहा हूं। अर्थातकोरडाटा विशेषता

निम्नलिखित जानकारी के साथ एक इकाई: जॉन, बेटी, एडवर्ड:

name | rate | factor | 
_______|______|________| 
John | 3.2 | 4 | 
Betty | 5.5 | 7 | 
Betty | 2.1 | 2 | 
Betty | 3.1 | 2 | 
Edward | 4.5 | 5 | 
John | 2.3 | 4 | 

कैसे मैं बस के साथ एक सरणी वापस जाने के लिए अनुरोध की स्थापना चाहते हैं?

उत्तर

69

आपको विशिष्ट रिकॉर्ड प्राप्त करने में सहायता के लिए बैकिंग स्टोर का उपयोग करना चाहिए।

आप के साथ एक सरणी प्राप्त करना चाहते हैं तो बस जॉन, बेटी, एडवर्ड यहाँ है तुम कैसे करते:

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"MyEntity"]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:self.managedObjectContext]; 

// Required! Unless you set the resultType to NSDictionaryResultType, distinct can't work. 
// All objects in the backing store are implicitly distinct, but two dictionaries can be duplicates. 
// Since you only want distinct names, only ask for the 'name' property. 
fetchRequest.resultType = NSDictionaryResultType; 
fetchRequest.propertiesToFetch = [NSArray arrayWithObject:[[entity propertiesByName] objectForKey:@"name"]]; 
fetchRequest.returnsDistinctResults = YES; 

// Now it should yield an NSArray of distinct values in dictionaries. 
NSArray *dictionaries = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil]; 
NSLog (@"names: %@",dictionaries); 
+0

एलीगेटर, लेकिन अगर मेरे पास एक ही विशेषता के साथ एक से अधिक ऑब्जेक्ट हैं (उदाहरण के लिए, एक से अधिक बेट्टी), और मैं ' टी बार-बार मूल्य प्राप्त करना चाहते हैं? –

+0

यह आपको तीन नामों की सरणी देगा, बिना डुप्लिकेट के। कोई अन्य डेटा नहीं कोई दर नहीं, कोई कारक नहीं। – AlleyGator

+1

मुझे रिटर्न डिस्टिंट रिजल्ट संपत्ति याद आई। धन्यवाद। उत्तर को ऊपर उठाया, लेकिन एनएसएआरएआरई में 'allValues' विधि नहीं है। तो मुझे सरणी में प्रत्येक NSDictionary से प्रत्येक मान प्राप्त करने के लिए अभी भी चक्र के लिए एक करने की आवश्यकता है। –

15

आप ऑब्जेक्ट ग्राफ़ मैनेजर के बजाय एक प्रक्रियात्मक डेटा बेस की तरह कोर डेटा का उपयोग करने का प्रयास कर रहे हैं, इसलिए आपको ऐसा करने का एक आसान तरीका नहीं मिलेगा।

कोर डेटा में ऐसा करने का कोई सीधा तरीका नहीं है क्योंकि कोर डेटा मूल्यों के बजाय वस्तुओं से संबंधित है। चूंकि प्रबंधित वस्तुओं को अद्वितीय होने की गारंटी दी जाती है, इसलिए कोर डेटा प्रत्येक ऑब्जेक्ट के मूल्यों के बारे में ज्यादा परवाह नहीं करता है या वे डुप्लिकेट या कुछ अन्य ऑब्जेक्ट के मान हैं।

अद्वितीय मान ढूंढने के लिए:

  1. एक fetch by specific value निष्पादित करें। इससे आपको कुंजी name और नाम स्ट्रिंग के मूल्य के साथ शब्दकोशों की एक सरणी मिल जाएगी।
  2. (1) में लौटाए गए सरणी पर अद्वितीय मानों का एक सेट वापस करने के लिए set collection operator का उपयोग करें।

तो, कुछ की तरह:

NSSet *uniqueNames=[fetchedNameDicts valueForKeyPath:@"@distinctUnionOfSets.name"]; 

... जो NSString का एक सेट वापस आ जाएगी सभी अद्वितीय मान के साथ वस्तुओं।

+1

+1 है यही कारण है कि मैं क्या कहने जा रहा था, सिवाय इसके कि मैं 'चुना है चाहता हूँ @" distinctUnionOfObjects.name "'। मुझे विश्वास नहीं है कि एक अंतर है। – Caleb

+0

एनएसईएक्सप्रेस और एनएसईएक्सप्रेसशन डिस्क्रिप्शन इस तरह कैसा दिखता है? – ephilip

+0

@ephilip - मैं उस पर एक और सवाल खोलूंगा। मैं इसे एक टिप्पणी में निचोड़ा नहीं कर सकता। – TechZen

5

Fetching Specific Property Values पर एक नज़र डालें, अलग-अलग मान प्राप्त करने के लिए सेट का उपयोग करना आवश्यक नहीं है।

+0

मैं ऑब्जेक्ट को पुनर्प्राप्त करना चाहता हूं, न कि केवल कॉलम मान। अगर आपके पास कोई विचार है तो कृपया मदद करें ........ @ एलेक्सेंड्रे एल बताता है –