2012-09-06 23 views
8

enter image description here पर एक क्रमबद्ध सेट (ios5) के साथ सॉर्ट डिस्क्रिप्टर के रूप में उपयोग करना चाहिए - मेरे पास Item इकाई और Tag इकाई है। - आइटम में कई टैग हो सकते हैं और टैग कई आइटमों से जुड़े जा सकते हैं (कई रिश्तों में से कई)। - रिश्ते एक "आदेशित रिश्ते" (आईओएस 5 में आदेशित रिश्तों का उपयोग करके) दोनों तरीकों से है।कोर डेटा: मुझे कई रिश्ते

NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"Item"]; 

// Fetch all items that have a given tag 
Tag* myTag = ....; 
request.predicate = [NSPredicate predicateWithFormat:@"ANY tag == %@", myTag]; 

// This is my attempt to get the correct sort ordering (it crashes) 
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"tag" 
                   ascending:YES]; 
request.sortDescriptors = @[sortDescriptor]; 

ऊपर प्रकार वर्णनकर्ता रिटर्न डेटा (जो मुझे लगता है कुछ क्रम में है) लेकिन फिर:

मैं निम्नलिखित अनुरोध लाने का उपयोग कर

इम किसी खास आइटम के सभी चाइल्ड टैग लाने के लिए चाहते हैं क्रैश:

[_NSFaultingMutableOrderedSet compare:]: unrecognized selector sent to instance 0x10b058f0 
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 
'-[_NSFaultingMutableOrderedSet compare:]: unrecognised selector sent to instance 0x10b058f0' 

यदि मैं एक खाली प्रकार वर्णनकर्ता सरणी देता हूं तो मुझे कोई दुर्घटना नहीं होती है लेकिन परिणाम का आदेश नहीं दिया जाता है।

आईओएस 5 में आदेशित रिलेशनशिप सुविधा का उपयोग करके कई रिश्तेदारों में सॉर्ट डिस्क्रिप्टर को सही ढंग से कैसे कार्यान्वित किया जाए?

+0

क्या आप स्पष्ट कर सकते हैं कि आप किस इकाई को प्राप्त कर रहे हैं? यदि आप 'आइटम' के उदाहरण प्राप्त कर रहे हैं, तो सॉर्ट डिस्क्रिप्टर 'आइटम' के क्रम क्रम को निर्धारित करने के लिए है और आदेशित रिश्ते के साथ कुछ भी नहीं है 'आइटम' को' टैग' करना है। अपवाद इसलिए होता है क्योंकि आपका कीपैथ विशेषता में समाप्त नहीं होता है लेकिन एक सेट होता है। उदाहरण के लिए 'टैग्स' @ गिनती 'का प्रयास करें। –

+1

मेरे पास एक समान प्रश्न है। इस मामले में, मैं टैग से जुड़े सभी आइटम ढूंढ रहा हूं (आइटम इकाई पर अनुरोध अनुरोध) और चूंकि टैग टू आइटम एक ऑर्डर किया गया रिश्ते है, इसलिए मैं डेटाबेस में सहेजे गए "ऑर्डर में" टैग से जुड़े आइटम लाने के लिए चाहता हूं। कोर्डटा आदेशित रिश्ते को बनाए रखने के लिए उपयोग की जाने वाली इंटरमीडिएट तालिका का पर्दाफाश नहीं करता है, तो NSFetchedResultsController में इसे कैसे निर्दिष्ट करें? – siasl

+0

मैं सहेजे गए क्रम में एक टैग intance से जुड़े आइटमों के सभी उदाहरण लाने की कोशिश कर रहा हूं। मैं कंसोल पर एसक्यूएल क्वेरी प्रिंट कर रहा हूं और यदि मैं सॉर्ट डिस्क्रिप्टर के रूप में टैग का उपयोग करता हूं, तो मैं देख सकता हूं कि परिणाम मध्यवर्ती तालिका द्वारा आदेश दिया गया है, हालांकि यह कोर डेटा के लिए आंतरिक है। सॉर्ट डिस्क्रिप्टर का उपयोग करके इस आदेश को निर्दिष्ट करने के लिए वैसे भी है? जेडडीडीआईटी से टी 0.Z_PK चुनें, t0.Z_PK = t1.Z_2ITEMS पर t1.Z_4TAGS = t1.Z_PK = t1.Z_2ITEM पर T1.Z_4TAGS =? T1.Z_FOK_2ITEM द्वारा आदेश दिया गया – Ash

उत्तर

15

मुझे लगता है कि आप कोर डेटा में एक आदेशित रिश्ते का मतलब गलत तरीके से समझ सकते हैं। this question के अनुसार, "आदेश दिया गया" का अर्थ "कुछ संपत्ति के संबंध में नहीं है" - इसके बजाय, "आदेश दिया गया" का अर्थ है "उपयोगकर्ता के आदेश को संरक्षित करता है" (या कोई अन्य विशिष्ट क्रम जो अन्यथा मनमाना लगता है)। कुछ उदाहरण:

  • एक आदेश दिया संबंध एक नुस्खा में कदम के लिए अच्छा (से एप्पल के Core Data Release Notes उदाहरण) होगा - कदम जरूरी उनके गुणों में से किसी के संबंध में आदेश दिया नहीं किया जा सका (जैसे उनके पाठ), और कोर डेटा ने ऑर्डर नहीं किया है, तो खुद को "इंडेक्स" या "ऑर्डर" संपत्ति को बनाए रखना होगा।
  • एक आदेश दिया गया रिश्ते नामों की सूची के लिए अच्छा नहीं होगा - उपयोगकर्ता पहले या अंतिम नामों से सॉर्ट करना चुन सकता है, उदाहरण के लिए, और नामों के संग्रह में आंतरिक रूप से कोई आंतरिक अंतर्निहित आदेश नहीं है। एकमात्र चीज जो मायने रखती है वह डिस्प्ले ऑर्डर है - डेटा को उस ऑर्डर को बनाए रखने की आवश्यकता नहीं है। (एप्पल डॉक्स में अंगूठे का नियम है कि यदि कोई उपयोगकर्ता क़यास प्रकार विनिर्देशक के बीच चयन कर सकता है, रिश्ते कोर डाटा में नहीं आदेश दिया जाना चाहिए।)

आपके मामले में, आप एक तरह से लागू करने का प्रयास आदेशक सेट (tags संपत्ति के मान) जो आप ला रहे हैं, के सेट का वर्णनकर्ता। यह आपके दुर्घटना का कारण है - NSOrderedSet subclass (_NSFaultingMutableOrderedSet, आपके मामले में) -compare: विधि को लागू नहीं करता है जो क्रमबद्ध वर्णनकर्ता उन्हें सॉर्ट करने के लिए उपयोग करेगा, और इसलिए आपको यह अपवाद मिलता है।

मुझे लगता है कि आपके लिए एक अच्छा समाधान का उपयोग किसी प्रकार का वर्णनकर्ता नहीं है; इसके बजाय, यदि आप उपयोगकर्ता को डिस्प्ले के लिए संरक्षित ऑर्डरिंग बदलना चाहते हैं, तो कुछ आइटम पर tags के लिए NSOrderedSet मान प्राप्त करें, फिर -sortedArrayUsingComparator: का उपयोग करके अपने स्वयं के सॉर्ट से इसे बाहर निकालें। यह कोर डेटा में डेटा को सही क्रम में रखेगा लेकिन आपको इसे प्रोग्रामेटिक रूप से पुन: व्यवस्थित करने देगा।

उच्च स्तर पर, आप यह भी विचार करना चाहेंगे कि आपको वास्तव में अपने रिश्तों में आदेश की आवश्यकता है या नहीं। यह एक महत्वपूर्ण प्रदर्शन जुर्माना लगाता है, और जो भी आप वास्तव में वापस प्राप्त करते हैं वह मूल क्रम है जिसमें टैग (या इसके विपरीत) टैग जोड़े गए थे।यदि आप टैग को हर बार प्रदर्शित करते समय उस ऑर्डर को बदलना चाहते हैं, तो आप उस प्रदर्शन को किसी भी वास्तविक लाभ के लिए हिट नहीं कर रहे हैं - अपने रिश्ते को बिना किसी प्रकार के बनाते हैं, फिर या तो प्रोग्रामेटिक रूप से सॉर्ट करना जारी रखें या एक समग्र कुंजी पर एक प्रकार का वर्णनकर्ता का उपयोग करें, जैसे कि [email protected] , टिप्पणियों में सुझाव के रूप में।

+0

यह एक महान स्पष्टीकरण है। – mkral

+0

धन्यवाद! मैं इसकी सराहना करता हूं। – Tim