2010-04-30 11 views
7

मैं कैसे अनुवाद तरह कुंजी और sectionKeyPath साथ NSFetchedResultsController इस्तेमाल कर सकते हैं?NSFetchedResultsController वर्गों स्थानीय अनुसार क्रमबद्ध

समस्या: मैं typeâ, typeB, typeC, जैसे डेटाबेस में संपत्ति "प्रकार" में आईडी ... और नहीं मूल्य सीधे क्योंकि यह स्थानीय होना चाहिए। अंग्रेजी टाइप ए = बर्ड, टाइप बी = बिल्ली, टाइपसी = जर्मन में कुत्ता यह वोगल, काट्ज़, हुंड होगा।

तरह कुंजी और sectionKeyPath "प्रकार" पर के साथ एक NSFetchedResultController साथ

मैं आदेश और वर्गों प्राप्त - typeâ - typeB - typeC

अगला मैं प्रदर्शन के लिए अनुवाद करते हैं और सब कुछ अंग्रेजी में ठीक है: - पक्षी - बिल्ली - कुत्ता

अब मैं जर्मन करने के लिए स्विच और एक गलत सॉर्ट क्रम प्राप्त - वोगेल - Katze - Hund

क्योंकि यह अभी भी टाइपए, टाइप बी, टाइपसी

द्वारा टाइप किया गया है, इसलिए मैं NSFetchedResultsController के लिए सॉर्टलाइज़ करने का एक तरीका ढूंढ रहा हूं।

मैं क्षणिक संपत्ति दृष्टिकोण की कोशिश की है, लेकिन क्योंकि इकाई में होने की तरह कुंजी जरूरत इस तरह कुंजी के लिए काम नहीं करता।

मेरे पास कोई अन्य विचार नहीं है। लेकिन मुझे विश्वास नहीं है कि स्थानीयकरण के लिए आवश्यक व्युत्पन्न विशेषता पर NSFetchedResultsController का उपयोग करना संभव नहीं है?

Using custom sections with NSFetchedResultsController? जैसे संबंधित विचार-विमर्श कर रहे हैं, लेकिन अंतर यह है कि कस्टम खंड के नाम और प्रकार कुंजी शायद उसी क्रम की है। मेरे मामले में नहीं और यह मुख्य अंतर है।

अंत मैं एक व्युत्पन्न विशेषता पर आवश्यक NSSortDescriptor के लिए एक तरह से आदेश की आवश्यकता होगी पर, मुझे लगता है। इस तरह के आदेश सेक्शनपैथ के लिए भी सेवा करनी है।

किसी भी संकेत के लिए धन्यवाद।

उत्तर

3

ठीक है, नहीं एक अच्छा समाधान है, लेकिन अंत में यह काम कर रहा है (क्योंकि मैं रिकॉर्ड की एक परिभाषित सीमित सेट है सीए 100):

एप्लिकेशन intializing पर:

  • मैं बना प्रबंधित ऑब्जेक्ट में "ऑर्डर बाय" विशेषता।
    • मैं जांचता हूं कि स्थानीयकरण (और इसके साथ सॉर्ट ऑर्डर) आखिरी बार बदल गया है या नहीं। यदि ऐसा है:
    • मैं सभी रिकॉर्ड्स लाता हूं और इसे स्थानीय नामों से एनएसएआरएआरई में सॉर्ट करता हूं।
    • मैं दुकान

कार्यक्षमता कारण मैं सिर्फ लाने और एक NSPredicate के अनुसार अभिलेखों को सॉर्ट लिए में रिकॉर्ड वापस लिखें।

मैं सॉर्ट कुंजी और सेक्शन कुंजी पथ के रूप में "ऑर्डर बाय" का उपयोग करके सभी मौजूदा कोड का उपयोग कर सकता हूं।

मुझे पता है कि मैं टेबल ऑर्डर के लिए अपने ऑर्डर किए गए सरणी को डेटासोर्स के रूप में उपयोग कर सकता हूं, लेकिन मैं मौजूदा कोड रखना चाहता हूं और NSFetchedResultsController के तरीकों का उपयोग करना चाहता हूं।

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

हालांकि यह एक सुरुचिपूर्ण समाधान नहीं है।

0

अंत में मुझे एक व्युत्पन्न विशेषता पर आवश्यक NSSortDescriptor के लिए एक क्रमबद्ध क्रम की आवश्यकता होगी, मुझे लगता है।

छंटाई के लिए, एक संभावना की तरह कुछ करने के लिए होगा:

[NSSortDescriptor initWithKey:@"type" 
ascending:YES 
selector:@selector(translatedCompare:)] 

जहां translatedCompare एक तुलना विधि आप लिखते हैं (NSString पर एक वर्ग के रूप में) है कि उनकी तुलना करने से पहले मूल्यों localizes है।

कैसे sectionKeyPath संभाल करने के बारे में सुनिश्चित नहीं हैं।

+0

हां, मैंने इसे एक निश्चित बिंदु पर करने की कोशिश की। लेकिन ईमानदार होने के लिए, मैं इस श्रेणी परिभाषित तुलना विधि का उपयोग करके एनएसएसटींग को मनाने में सक्षम नहीं था .... मुझे अनुभाग कीपैथ की समस्या नहीं होने की उम्मीद नहीं थी क्योंकि मैं यहां क्षणिक संपत्ति का उपयोग कर सकता हूं जो कि क्रमबद्ध क्रम से मेल खाना चाहिए सॉर्ट डिस्क्रिप्टर से स्थानीयकृत प्रकार। – Gerd

+0

मैंने इसे एक और प्रयास दिया है। कृपया उत्तर दें "मैंने कस्टम तुलना के साथ फिर कोशिश की ..." (एक टिप्पणी के लिए बहुत लंबा)। – Gerd

0

मुझे लगता है कि इस समस्या को कैश के कारण होता है।

जब आप निम्नलिखित विधि का उपयोग कर NSFetchedResultsController वस्तु बनाने के दिए गए नाम के साथ कैश निर्धारित कर सकते हैं। अंतिम चर कैश नाम है।

- (id)initWithFetchRequest:(NSFetchRequest *)fetchRequest managedObjectContext:(NSManagedObjectContext *)context sectionNameKeyPath:(NSString *)sectionNameKeyPath cacheName:(NSString *)name 

NSFetchedResultsController अगर एक ही नाम के साथ कैश मौजूद वर्गों और आदेश की गणना करने के कैश का उपयोग करता। और कैश डिस्क पर लिखा गया है (स्मृति नहीं)।

तो यदि आप अंग्रेजी और जर्मन के बीच भाषा बदलते हैं, तो आपको कैश को हटाना चाहिए। कैश को हटाने के लिए आप क्लास विधि deleteCacheWithName: का उपयोग कर सकते हैं।

आप यहां विस्तार की जानकारी पा सकते हैं। http://developer.apple.com/iphone/library/documentation/CoreData/Reference/NSFetchedResultsController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40008227-CH1-SW24

+0

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