2011-02-01 26 views
6

मुझे पता है कि मैं एसक्यूएल में निम्नलिखित की तरह कुछ को खोजने के लिए उपयोग कर सकते हैं @distinctUnionOfObjects समकक्ष द्वारा:ग्रुप के लिए कोर डाटा

SELECT a_value 
FROM my_table 
GROUP BY a_value; 

क्या मैं तलाश कर रहा हूँ डेटा एक सरणी में लौटे की सब है , अभिव्यक्ति द्वारा समूह से मेल खाने वाले मानों की सरणी नहीं। अनिवार्य रूप से, मैं कोर डेटा के लिए निम्नलिखित SQL क्वेरी के बराबर की तलाश में हूँ:

SELECT * 
FROM my_table 
GROUP BY a_value; 
+0

करें यदि एक जवाब आप बाहर की मदद की तो हमें बताएं। –

उत्तर

15

यह अनुरूप

SELECT 'Status', COUNT(*) FROM 'Records' GROUP BY 'Status' है:

NSFetchRequest* fetch = [NSFetchRequest fetchRequestWithEntityName:@"Record"]; 
NSEntityDescription* entity = [NSEntityDescription entityForName:@"Record" 
              inManagedObjectContext:myManagedObjectContext]; 
NSAttributeDescription* statusDesc = [entity.attributesByName objectForKey:@"status"]; 
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath: @"url"]; // Does not really matter 
NSExpression *countExpression = [NSExpression expressionForFunction: @"count:" 
                  arguments: [NSArray arrayWithObject:keyPathExpression]]; 
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init]; 
[expressionDescription setName: @"count"]; 
[expressionDescription setExpression: countExpression]; 
[expressionDescription setExpressionResultType: NSInteger32AttributeType]; 
[fetch setPropertiesToFetch:[NSArray arrayWithObjects:statusDesc, expressionDescription, nil]]; 
[fetch setPropertiesToGroupBy:[NSArray arrayWithObject:statusDesc]]; 
[fetch setResultType:NSDictionaryResultType]; 
NSError* error = nil; 
NSArray *results = [myManagedObjectContext executeFetchRequest:fetch 
                 error:&error]; 

Found here

+0

@ "बिमावा" आपने यहां "यूआरएल" विशेषता क्यों उपयोग की है? – Developer

+0

@ डेवलपर // वास्तव में कोई फर्क नहीं पड़ता // मुझे लगता है कि यह एक रुद्रवट है। – Bimawa

+0

उपरोक्त स्निपेट में, 'url'' रिकॉर्ड्स 'तालिका में एक फ़ील्ड है। तारांकन के साथ 'COUNT (*)' निर्दिष्ट करने का कोई तरीका नहीं है, लेकिन यह 'COUNT (x)' के बराबर है, जहां तालिका में 'x' कोई स्तंभ है। यही वह पंक्ति है जो उस पंक्ति में निर्दिष्ट है। – Demitri

-1

आप Predicate Programming उपयोग कर सकते हैं।

संपादित करें: क्षमा करें आप समूह के लिए भविष्यवाणियों का उपयोग नहीं कर सकते हैं कम से कम सीधे आगे नहीं। मैंने सिर्फ संदर्भों पर पढ़ा है।

सीमाएं: आप अनिवार्य रूप से "मनमानी" एसक्यूएल प्रश्नों का अनुवाद भविष्य में या अनुरोध लाने में अनुवाद नहीं कर सकते हैं। कोई तरीका नहीं है, उदाहरण के लिए, किसी SQL बयान कन्वर्ट करने के लिए इस तरह के रूप

चयन t1.name, V1, V2

FROM table1 t1 JOIN (SELECT t2.name AS V1, count(*) AS V2 

    FROM table2 t2 GROUP BY t2.name as V) on t1.name = V.V1 
+0

क्या आप अधिक विशिष्ट हो सकते हैं? मुझे पता है कि भविष्यवाणी मौजूद है, लेकिन मुझे नहीं पता कि वे मेरी समस्या का समाधान कैसे करेंगे। वे एसक्यूएल में समूह या अलग() से कुछ कैसे प्रदान करेंगे? – smtlaissezfaire

+0

हाँ, मैंने उस कथन को भी देखा।दुर्भाग्यवश, यह बिल्कुल स्पष्ट नहीं है * क्या * सीमाएं हैं। दस्तावेज़ीकरण में दी गई क्वेरी बहुत जटिल है (इसमें शामिल होना शामिल है) - मैं एक सीधी तालिका पढ़ रहा हूं। – smtlaissezfaire

3

आप एक NSFetchedResultsController वस्तु का उपयोग कर के माध्यम से समूहीकरण प्रदान करने के लिए कोशिश कर सकते sectionNameKeyPath प्रारंभकर्ता में निर्माण। ध्यान दें कि एफआरसी मुख्य रूप से तालिका दृश्य के साथ जोड़े के लिए उपयोग किया जाता है, लेकिन यह वास्तव में आवश्यक नहीं है। इस तरह आप अपने परिणामों को अपने सेक्शननामैपपाथ द्वारा समूहित कर सकते हैं जो आपके मॉडल में भी एक क्षणिक विशेषता हो सकती है।

एक टिप्पणी के रूप में, मैं डेटाबेस के संदर्भ में कोर डेटा की सोच की सिफारिश नहीं करता, जो यह नहीं है। कोर डेटा आपके लिए ऑब्जेक्ट रिश्तों को बनाए रखने और प्रबंधित करने में आसान बनाने के लिए बनाया गया है। सिर्फ इसलिए कि आईओएस पर यह SQLite के शीर्ष पर चलता है, यह डेटाबेस प्रतिस्थापन नहीं करता है।

संदर्भ: NSFRC Reference

0

मैं इस विधि (मोटे तौर पर स्वीकार किए जाते हैं जवाब के समान) को खोजने के एक छोटे से क्लीनर और आसान हो करने के लिए समझने के लिए।

SELECT COUNT(*), a_value FROM my_table GROUP BY a_value;

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:[MyTable className]]; 

// create expression for grouped column 
NSExpressionDescription *aValueDescription = [[NSExpressionDescription alloc] init]; 
aValueDescription.name = @"aValue"; // name of key in result dictionary 
aValueDescription.expression = [NSExpression expressionWithFormat:@"aValue"]; 
aValueDescription.expressionResultType = NSObjectIDAttributeType; 

// create expression for count 
NSExpressionDescription *countDescription = [[NSExpressionDescription alloc] init]; 
countDescription.name = @"count"; // name of dictionary key in result dictionary 
countDescription.expression = [NSExpression expressionWithFormat:@"[email protected]"]; 
countDescription.expressionResultType = NSInteger32AttributeType; 

// fill out fetch request 
fetchRequest.propertiesToGroupBy = @[@"aValue"]; 
fetchRequest.propertiesToFetch = @[aValueDescription, countDescription]; 
//fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"count" ascending:NO]]; // not sure why this crashes 
fetchRequest.resultType = NSDictionaryResultType; // required for "group by" requests 

NSError *error = nil; 
NSArray *results = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

लौटे results NSDictionary की एक सरणी है: यह करने के लिए एसक्यूएल बराबर है। ध्यान दें कि वर्णन name गुण आपकी इच्छानुसार कुछ भी हो सकते हैं - वे केवल लौटे गए शब्दकोशों में कुंजी के नाम हैं। तालिका से पंक्तियों को फ़िल्टर करने के लिए fetch अनुरोध में कोई भविष्यवाणी कर सकता है; यह कोड सभी पंक्तियों को वापस करता है।

बोनस किसी को अंक जो मुझे बताओ कैसे प्रकार वर्णनकर्ता काम करने के लिए कर सकते हैं ...

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