2016-05-26 9 views
8

मैं इस स्थिति के लिए मेरे CoreData मॉडल डिजाइन करने के लिए कोशिश कर रहा हूँ लाने:NSFetchedResultsController जटिल अनुरोध और मॉडल

हम Song वस्तु जो करने के लिए कई कुछ List साथ रिश्ता है की है।

प्रत्येक Listname संपत्ति है और यह भी करने के लिए कई Song

क्योंकि एक Song एक ही समय में प्रत्येक List में प्रस्तुत किया जा सकता ये कई-से-अनेक संबंध की जरूरत है के साथ संबंध हैं।

मैं किसी भी तरह Song इन हेडर (List का नाम) के आधार पर वर्गीकृत रों की सूची प्राप्त करने NSFetchedResultsController का उपयोग कर की जरूरत है (के बाद से उपयोगकर्ता 10,000 गीत हो सकता है और मैं NSArray में कहीं यह स्टोर करने के लिए नहीं करना चाहते हैं)।

जब मैं कुछ मूल्य के साथ sectionNameKeyPath: सेट करने का प्रयास करता हूं, उदा। @"List.name" मुझे एक त्रुटि मिली है "कई रिश्तों की अनुमति नहीं है" और निश्चित रूप से यह समझ में आता है।

तो मैं मदद कैसे अपने मॉडल डिजाइन Song रों और कुछ List तरह "इतिहास"/"अगला बजाना" आदि के लिए सक्षम होने के लिए और NSFetchedResultsController के साथ सभी डेटा लाने के लिए सक्षम होना करने के लिए की जरूरत है।

किसी भी मदद की सराहना की। अगर मेरी व्याख्या स्पष्ट नहीं थी, तो कृपया अतिरिक्त जानकारी पूछें। मेरी कोड के

भाग:

- (void)initFetch { 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Song"]; 

    [fetchRequest setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"index" ascending:YES]]]; 
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"ANY [email protected] != 0"]; 
    fetchRequest.fetchBatchSize = 20; 

    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.context sectionNameKeyPath:@"name" cacheName:nil]; 
    [self.fetchedResultsController setDelegate:self]; 

    NSError *error = nil; 
    [self.fetchedResultsController performFetch:&error]; 

    if (error) { 
     NSLog(@"Unable to perform fetch."); 
     NSLog(@"%@, %@", error, error.localizedDescription); 
    } 
} 

उत्तर

0

आप अत्यधिक डेटा लोड हो रहा है को रोकने के लिए एक एफआरसी उपयोग करने के लिए की जरूरत नहीं है, यह बात है कि नहीं करता है। एफआरसी की शक्ति परिवर्तनों का पता लगाने के संदर्भ में इसका अवलोकन है। जब आप रिश्ते में नेविगेट करने की कोशिश कर रहे हों तो वह शक्ति भी अच्छी तरह से काम नहीं करती है, इसलिए शायद आप इस मामले में एफआरसी का उपयोग करने से भी लाभ नहीं उठा पाएंगे।

आपके डेटा उपयोग को उन चीज़ों को फिर से गलती कर रही है जब आपको उनकी आवश्यकता नहीं होती है (मैन्युअल रूप से कुछ मामलों में, लेकिन सिस्टम इसे स्वयं करने के दौरान ही करेगा) और fetch अनुरोध बैचिंग। जब आप fetch अनुरोध पर बैच आकार सेट करते हैं तो वापस NSArray स्मृति में एक समय में डेटा के पृष्ठों को लोड करने से निपटेंगे। इस से एफआरसी लाभ, लेकिन इसे नियंत्रित नहीं करता है - और यदि आप बैच को जोड़ना भूल जाते हैं तो एफआरसी आपके लिए यह नहीं करेगा!

तो, आप या तो एक सिस्टम स्थापित कर सकते हैं जहां आपके पास एकाधिक एरे, 1 प्रति अनुभाग है, और सबकुछ स्वयं प्रबंधित करें। या आप प्रत्येक सेक्शन के लिए एकाधिक एफआरसी, 1 का उपयोग कर सकते हैं, और इंडेक्स पथों में हेरफेर कर सकते हैं ताकि सब कुछ एक साथ लटका हो।

या, आप, मध्यवर्ती वस्तुओं जो एक List में एक Song की सदस्यता का प्रतिनिधित्व जोड़कर अपने डेटा मॉडल को बदल सकता है, क्योंकि यह कई-से-अनेक रिश्ते तोड़ने के लिए और पहले का है में एक नाव्य संबंध के साथ छोड़ और वर्णनकर्ता को सॉर्ट होगा । इस मामले में नई इकाई वह होगी जिसे आप एफआरसी के लिए ला रहे थे। संबंधों में परिवर्तन ट्रैकिंग के बारे में ऊपर उल्लिखित मुद्दे पर ध्यान दें, हालांकि, आप जो बदलते हैं और कैसे ...

+0

टिप्पणी के लिए धन्यवाद, लेकिन मुझे एफआरसी के बारे में आपके बयान से असहमत होना चाहिए स्मृति स्मृति को कम करने में मदद नहीं करेगा। उदाहरण के लिए, मेरे ऐप में अब एक प्लेलिस्ट हो सकती है जिसमें 20000 से अधिक गाने शामिल हैं और जब मैं इन सभी रिकॉर्ड्स को प्राप्त करता हूं तो ऐप बस क्रैश हो जाता है। मुझे इन सभी चीजों को मैन्युअल रूप से प्रबंधित करने का विचार पसंद नहीं है और मेरे पास कोई संकेत नहीं है कि यह कैसे करें :) इसके अलावा, [@ ब्रैड का उत्तर] (http://stackoverflow.com/a/1263845/1263701) बताओ कि मेरी स्थिति में एफआरसी बहुत उपयोगी है। – zakhej

+1

ब्रैड का जवाब पूरी तरह से सही है, यह भी कहता है कि मैच मैनेजमेंट की कुंजी होने के कारण मैं बैच आकार के बारे में ऐसा करता हूं। हालांकि वह संबंधों को कवर नहीं करता है, और यही वह है जो मैं कवर करता हूं और आपको किस समस्या का सामना करना पड़ता है। मैं आपके डेटा मॉडल को बदलने की सिफारिश करता हूं ... – Wain

+0

मैं नहीं देखता, एन: एम को मध्यवर्ती वस्तुओं में क्यों तोड़ने में मदद मिल सकती है। यह एन: एम रिश्ते के कार्यान्वयन की समस्या नहीं है। हालांकि, मैं भी कई एफआरसी का उपयोग करने की सिफारिश करेंगे। –

1

एफआरसी का उपयोग करना आपके उपयोगकर्ता को डेटा प्रदर्शित करने के लिए बहुत अच्छा हो सकता है लेकिन इसका उपयोग करने में यह निर्देश दे सकता है कि आपके मॉडल को कैसे बनाया जा सकता है इसके बजाय आपके मॉडल की इकाइयों को कैसे महसूस किया जा सकता है और संबंधों को संरचित किया जाना चाहिए। आपके मामले में ऐसा लगता है कि आप गाने के किसी सूची की बजाय अपने डेटाबेस में गाने के लिए वास्तविक States की एक सूची देखना चाहते हैं। प्रत्येक राज्य के उदाहरण में एक गीत के साथ एक-एक संबंध होगा और राज्य में आपकी सूचियों में एक से अधिक संबंध हो सकते हैं। एक इतिहास सूची, playNext सूची से जुड़ा होना, वर्तमान में "सूची" प्ले करना (अंतिम मामले में केवल एक उदाहरण के साथ)। अपनी एफआरसी इकाई को इस State इकाई और अनुभाग कुंजी-पथ से जोड़कर उस सूची से जुड़ा हुआ है जो राज्य में है, जो इंडेक्सपैथ में हेरफेर किए बिना या कई एफआरसी के साथ काम किए बिना उपर्युक्त आवश्यकता प्राप्त कर सकता है। साथ ही यह अलग इकाई होने से आप बाद में अन्य विशेषताओं को जोड़ सकते हैं जैसे कि आखिरी बार खेला गया था या यह कितना बार खेला गया है। जो सभी गीत इकाई के बजाए राज्य इकाई पर किया जा सकता है।

+0

यह मेरे उत्तर में विकल्पों में से एक का वर्बोज़ विवरण है, जो इसे बहुत अच्छी तरह से समझाता है, लेकिन मैं राज्य के उदाहरणों का पुन: उपयोग नहीं करता, क्योंकि यह प्रबंधन करता है और उपयोग अधिक कठिन है (एक से एक रिश्ते का मतलब है कि सूची का नाम प्राप्त करना मुश्किल है, और जब राज्य की आवश्यकता नहीं होती है तो इसे हटाना आसान होता है - और इसे हटाने के नियम के साथ किया जा सकता है) – Wain

+0

मैं सहमत हूं कि मैंने किया राज्य के मामलों का पुन: उपयोग करने का मतलब नहीं है। मेरा मतलब था कि प्रत्येक राज्य का उदाहरण एक सूची से लिंक होगा और फिर कुछ बदलाव होने पर एक नया राज्य उदाहरण बनायेगा। मुझे लगता है कि मैंने इसे अच्छी तरह से समझाया नहीं है। मैंने अभी भी आपका जवाब फिर से पढ़ा है और देखा है कि आपने "इंटरमीडिएट" ऑब्जेक्ट का उल्लेख किया गया अंतिम विकल्प उसी प्रकार का समाधान है जिसे मैंने यहां प्रस्तावित किया था। –

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