2012-10-05 6 views
6

सेटअप: मेरे पास मूल वस्तुओं का संग्रह है, उन्हें ऑब्जेक्टए कहते हैं। प्रत्येक ऑब्जेक्ट ए में ऑब्जेक्टबी के साथ एक से अधिक संबंध हैं। इसलिए, एक ऑब्जेक्टए में 0..n ऑब्जेक्टबी-एस हो सकता है, और प्रत्येक ऑब्जेक्टबी के पास अपने माता-पिता के रूप में एक विशिष्ट ऑब्जेक्ट होता है।संबंधित ऑब्जेक्ट संग्रह की विशेषता के आधार पर कोर डेटा परिणामों को कैसे सॉर्ट करें?

अब, मैं ऑब्जेक्टए-एस के कोर डेटा फ़ेच करना चाहता हूं, जहां उन्हें अपने नवीनतम ऑब्जेक्टब द्वारा क्रमबद्ध किया जाता है। क्या इसके लिए एक प्रकार का वर्णनकर्ता बनाना संभव है?

a related question है जो बिल्कुल वही स्थिति का वर्णन करता है। उत्तर ऑब्जेक्टबी से ऑब्जेक्ट ए में विशेषता को denormalizing बताता है। यह ठीक होगा अगर एक fetch अनुरोध के साथ ऐसा करने का कोई तरीका नहीं है।

संबंधित सवाल भी कहा गया है:

Actually, I just had an idea! Maybe I can sort Conversations by me[email protected]

मैंने कोशिश की। ऐसा प्रतीत नहीं होता है।

2012-10-05 17:51:42.813 xxx[6398:c07] *** Terminating app due to uncaught 
exception 'NSInvalidArgumentException', reason: 'Keypath containing 
KVC aggregate where there shouldn't be one; failed to handle 
[email protected]' 

ObjectA में विशेषता केवल/सबसे अच्छा समाधान denormalizing है: मैं इस त्रुटि मिलती है?

उत्तर

0

आप ObjectB में एक विशेषता है जो ऐड तारीख से समय स्टाम्प है जोड़ सकता है तो अनुरोध लाने में आप कुछ इस तरह कर सकते हैं:

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"objectB.addTime" ascending:YES]; 
... 
fetchRequest.sortDescriptors = @[descriptor]; 
+2

यह मेरे लिए काम नहीं करता: 'एनएसआईएनवालिडअर्ग्यूमेंट एक्सेप्शन', कारण: 'यहां कई कुंजी की अनुमति नहीं है' –

0

मैं इस सवाल का पता थोड़ा पुराना है लेकिन क्या मैंने सभी ऑब्जेक्ट्स प्राप्त किए थे, परिणामों पर पुन: प्रयास करते थे और ऑब्जेक्टबी प्रॉपर्टी खींचते थे और इसे एक नई सरणी में जोड़ते थे।

NSFetchRequest *fetchRequest = [NSFetchRequest new]; 
[fetchRequest setEntity:self.entityDescForObjectB]; 

// sort 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES]; 
[fetchRequest setSortDescriptors:@[sortDescriptor]]; 

NSError *error = nil; 
NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
if (fetchedObjects == nil) { 
    NSLog(@"Error fetching objects: %@", error.localizedDescription); 
    return; 
} 

// pull out all the ObjectA objects 
NSMutableArray *tmp = [@[] mutableCopy]; 
for (ObjectB *obj in fetchedObjects) { 
    if ([tmp containsObject:obj.objectA]) { 
     continue; 
    } 
    [tmp addObject:obj.objectA]; 
} 

यह काम करता है क्योंकि CoreData एक ऑब्जेक्ट ग्राफ़ है ताकि आप पीछे की ओर काम कर सकें। अंत में लूप मूल रूप से यह देखने के लिए जांच करता है कि tmp सरणी में पहले से ही एक विशिष्ट ऑब्जेक्टए उदाहरण है और यदि इसे सरणी में नहीं जोड़ता है।

यह महत्वपूर्ण है कि आप ऑब्जेक्टबी को सॉर्ट करें अन्यथा यह अभ्यास व्यर्थ है।

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