9

Phew, लंबे शीर्षक के लिए खेद है।एकल कोरडेटा इकाई को सहेजना (संपूर्ण संदर्भ नहीं) NSFetchedResultController कार्यक्षमता रखते हुए

मेरे पास एक एकल प्रबंधित ऑब्जेक्ट संदर्भ है जहां मैं दो अलग-अलग स्थानों से प्राप्त गीत संग्रहीत कर रहा हूं। मुझे फोन पर लगातार स्टोरेज (कोर डेटा का उपयोग करके) के कुछ गाने मिलते हैं, और मैं कुछ गानों को ऑनलाइन डेटाबेस से खींचता हूं। दोनों गाने एक ही MananagedObject उपclass के हैं। मैं इन दोनों गीतों को एक संदर्भ में रखना चाहता हूं क्योंकि मैं उन्हें दोनों को NSFetchedResultsController से जुड़े टेबल व्यू पर दिखाना चाहता हूं।

समस्या तब होती है जब मैं किसी एक गाने को सहेजना चाहता हूं। मैं उन सभी गानों को सहेजना नहीं चाहता जिन्हें मैंने ऑनलाइन डेटाबेस से फोन पर खींच लिया था। मैं सिर्फ एक गीत को सहेजना चाहता हूं, इसलिए एक साधारण [मोक सेव] काम नहीं करता है। दूसरा मुद्दा यह है कि जब मैं एकल गीत को सहेजता हूं, तब भी मैं चाहता हूं कि गाने ऑनलाइन से संदर्भ में हों (लेकिन फिर से, सहेजा नहीं गया)। मेरा मानना ​​है कि मेरे पास कुछ अलग-अलग विकल्प हैं:

1) क्या एनएसएफटेड रीसेट नियंत्रक एकाधिक संदर्भों से जुड़ा हुआ है?

2) मैं ऑनलाइन डेटाबेस से खींचे गए सभी गाने को एक अलग अस्थायी संदर्भ में ले जा सकता हूं, मूल संदर्भ में सहेज सकता हूं, और फिर सभी गीतों को वापस ले जा सकता हूं। (देखें: How do I copy or move an NSManagedObject from one context to another?)

3) ऑनलाइन गाने के लिए सभी महत्वपूर्ण मूल्य जोड़े याद रखें, संदर्भ से ऑनलाइन गाने हटाएं, मूल संदर्भ सहेजें, सभी ऑनलाइन गीतों को मूल संदर्भ में वापस डालें सहेजे गए कुंजी-मूल्य जोड़े का।

4) मैं एक विशाल n00b हूं और कुछ आसान याद कर रहा हूं।

धन्यवाद!

+0

आप वास्तव में क्या सहेजना चाहते हैं? गीत या वास्तविक गीत डेटा (फ़ाइल) का स्थान? – sosborn

उत्तर

8

मुझे लगता है कि करने के लिए सबसे आसान काम आपके लगातार स्टोर समन्वयक से जुड़ा दूसरा NSPersistentStore होगा। आप उस स्टोर को इन-मेमोरी स्टोर में रख सकते हैं, और अपने सभी "ऑनलाइन" परिणामों को उस (अस्थायी) स्टोर में स्टोर कर सकते हैं। आप निर्दिष्ट कर सकते हैं कि assignObject:toPersistentStore: के साथ एक नई डाली गई वस्तु को कौन सा स्टोर सहेजा जाना चाहिए। एक बार ऐसा करने के बाद, आप स्वतंत्र रूप से सहेज सकते हैं, क्योंकि "सेव" केवल आपके ऑनलाइन गाने के लिए स्मृति के साथ होगा।

फिर, जब आप ऑनलाइन सेट से स्थायी सेट पर एक गीत ले जाना चाहते हैं, तो बस इसे हटाएं और इसे फिर से सम्मिलित करें, उसी ऑब्जेक्ट के साथ अपने स्थायी निरंतर स्टोर में नई ऑब्जेक्ट असाइन करें।

यह आपको अपने से जुड़ा एक एकल NSManagedObjectContext उपयोग करने देगा, जो NSPersistentStore दोनों से ऑब्जेक्ट्स को देखेगा।

+0

ऐप्पल इसी तरह के परिदृश्यों (जैसे ऐप के साथ आने वाले डिब्बाबंद स्टार्टर डेटा) के लिए कई लगातार स्टोर्स का उपयोग करने को बढ़ावा देता है। मैं कहूंगा कि यह एक अच्छा विचार है जब भी आपके पास ऐसी संस्थाएं होती हैं जिनकी निरंतर भंडारण योजनाएं भिन्न होती हैं। – rickster

+0

ग्रेट उत्तर। मान लीजिए कि मेरे प्रश्न का उत्तर विकल्प # 4 था ... – rizzes

+1

सावधान रहें यदि आप अलग-अलग स्टोर्स का उपयोग कर रहे इकाइयों के बीच संबंध बनाए रखते हैं। ऐप्पल में हमारे दोस्तों के मुताबिक: "आपको सावधान रहना चाहिए कि एक लगातार स्टोर में उदाहरणों से संबंधों को एक और लगातार स्टोर में उदाहरण न दें, क्योंकि यह कोर डेटा द्वारा समर्थित नहीं है। अगर आपको विभिन्न स्टोर्स में इकाइयों के बीच संबंध बनाना है , आप आम तौर पर प्राप्त संपत्तियों का उपयोग करते हैं "https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html#//apple_ref/doc/uid/TP40001857-SW5 – NSTJ

5

जेसी का समाधान ठीक काम करेगा।

हालांकि, एक और विकल्प के रूप में, आप बस एक विस्तृत निरीक्षक के लिए एक नेस्टेड संदर्भ का उपयोग कर सकते हैं।

वह संदर्भ आपके सभी "अस्थायी" आइटम रख सकता है, लेकिन चूंकि यह आपके "बचत" संदर्भ का बच्चा है, इसलिए सभी fetches ठीक काम करेंगे।

NSManagedContext *tempContext = [[NSManagedContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 
tempContext.parentContext = mainManagedObjectContext; 

एएलएल आपकी बचत मुख्य प्रबंधन ऑब्जेक्ट कॉन्टेक्स्ट में डाली जाएगी, और सहेजने के साथ सहेजी जाएगी:। आपके सभी अस्थायी आइटम tempContext में जाएंगे।

अपने fetched परिणाम नियंत्रक को tempContext से भी संलग्न करें।

जब आप अस्थायी वस्तुओं से छुटकारा पाने के लिए तैयार होते हैं, तो बस tempContext को शून्य पर सेट करें।

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