2009-10-20 12 views
6

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

मेरे उद्देश्यों के लिए वे सभी एक ही विभाग में आयात किए जाएंगे (जिसे उपयोगकर्ता पहले से ही स्पष्ट रूप से चुना गया है)।

जाहिर है मैं दो संदर्भों के पार संबंधों की स्थापना नहीं कर सकते हैं तो मैं है:

  1. importMoc में एक विभाग बनाने के लिए और फिर जब मैं परिवर्तन मर्ज "असली" विभाग के साथ "आयात" विभाग विलय?
  2. 2) कर्मचारियों को मर्ज करें और फिर सभी ताजा आयातित कर्मचारियों (किसी भी तरह !!!) लाएं और फिर अपना विभाग निर्धारित करें?
  3. 3) कुछ अन्य समाधान जिन्हें मैंने अनदेखा किया है?

यह एक साधारण समस्या की तरह लगता है लेकिन किसी कारण से (आलस्य? थकावट? मूर्खता?) मैं यह नहीं समझ सकता कि इसके बारे में कैसे जाना है! अब तक जो कुछ भी मैंने कोशिश की है वह बहुत विस्तृत और जटिल लगती है!

अग्रिम धन्यवाद!

उत्तर

0

1/कर्मचारी रिकॉर्ड एक्स नाम Y और विभाग आईडी 15 (यानी यह आईडी 15 के साथ विभाग संदर्भित करता है एक रिश्ता के माध्यम से) प्रबंधित वस्तु संदर्भ से विभाग आईडी 15 के साथ

2/लोड विभाग है मान

3/एक कर्मचारी है कि कम से (2)

यानी बनाई गई वस्तु संदर्भित करता है बनाने के (ध्यान दें: केवल नमूना कोड, शायद संकलन नहीं होगा):

NSEntityDescription * departmentED = [NSEntityDescription entityForName:@"Department" inManagedObjectContext:moc]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(id == %@)", deptId]; 

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
[request setEntity:departmentED]; 
[request setPredicate:predicate]; 

NSError *error = nil; 
NSArray *array = [moc executeFetchRequest:request error:&error]; 

/* create employee */ 

NSEntityDescription * employeeED = [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:moc]; 
NSManagedObject * employeeMO = [[[NSManagedObject alloc] initWithEntity:employeeED insertIntoManagedObjectContext:moc] autorelease]; 

/* set employee department to department instance loaded above */ 
[receiptObject setValue:[array objectAtIndex:0] forKey:@"department"]; 
+0

धन्यवाद diciu लेकिन यह दो अलग-अलग संदर्भों के बीच संबंध स्थापित करने के सर्वोत्तम तरीके के बारे में मेरे प्रश्न का उत्तर नहीं देता है (जैसा कोर में अनुशंसित है डेटा प्रोग्रामिंग गाइड - कुशलतापूर्वक आयात डेटा)। समय पर प्रतिबंधों के कारण मैंने वर्तमान में आयात के लिए दूसरे प्रबंधित ऑब्जेक्ट संदर्भ का उपयोग करना बंद कर दिया है, लेकिन मैं अभी भी सही दृष्टिकोण जानने के लिए उत्सुक हूं। मुझे निम्नलिखित हालिया प्रश्न भी मिला लेकिन प्रदान किए गए उत्तर बहुत संतोषजनक नहीं हैं: http: // stackoverflow।कॉम/प्रश्न/1554623/अवैध-प्रयास-से-स्थापित-ए-रिश्ते-xyz-between-objects-in-different-co – Matthew

4

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

उदाहरण के लिए:

foreach (NSDictionary *record in employeeRecords) { 
    NSManagedObject *employee = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:importMoc]; 
    // Configure employee however you do that 

    NSString *managerID = [record objectForKey:@"someKeyThatUniquelyIdentifiesTheManager"]; 
    NSFetchRequest *managerFetchRequest = [[NSFetchRequest alloc] init]; 
    [managerFetchRequest setEntity:[NSEntity entityForName:@"Manager" inManagedObjectContext:importMoc]]; 
    [managerFetchRequest setPredicate:[NSPredicate predicateWithFormat:@"managerProperty == %@", managerID]]; 
    NSArray *managers = [importMoc executeFetchRequest:managerFetchRequest error:nil]; // Don't be stupid like me and catch the error ;-) 
    [managerFetchRequest release]; 

    if ([managers count] != 1) { 
     // You probably have problems if this happens 
    } 

    [employee setValue:[managers objectAtIndex:0] forKey:@"manager"]; 
} 

आप, साथ ही importMoc में प्रबंधकों के सभी मिलता है और फिर उस सरणी को फ़िल्टर सही हर बार पता लगाने के लिए के लिए एक एकल लाने का अनुरोध कर सकता है। यह शायद बहुत अधिक कुशल होगा। दूसरे शब्दों में, जो मैंने अभी आपको ऊपर करने के लिए कहा है, वह न करें :-)

+0

तो ठीक मैनुअल पढ़ना: यदि मैं भविष्यवाणी छोड़ देता हूं तो आपने अनदेखा करने और कॉल करने के लिए कहा [importMoc executeFetchRequest: त्रुटि:] मुझे एक ऐसे सरणी मिलेगी जिसमें सभी प्रबंधकों (उदाहरण के लिए) एक सतत स्टोर में सहेजे गए हैं (उनके संदर्भ के बावजूद) वर्तमान में किसी भी प्रबंधक (importMoc) संदर्भ में किसी भी प्रबंधक को बचाया गया है चाहे वे सहेजे गए हों या नहीं नहीं। क्या मैं इसे सही ढंग से समझ रहा हूं? – Matthew

+0

सही। संदर्भ केवल तभी मायने रखता है जब वस्तुएं स्मृति में होती हैं। एक बार उन्हें लगातार स्टोर में सहेजा गया है, उन्हें किसी भी संदर्भ में लाया जा सकता है। – Alex

+0

इस जवाब के लिए धन्यवाद बहुत कुछ कहना एलेक्स। मुझे एहसास नहीं हुआ था कि अगर एक ही लगातार स्टोर समन्वयक होता है तो एक fetch ऑब्जेक्ट को एक अलग संदर्भ में जोड़ देगा। मुझे यही समस्या थी और इस जवाब ने मेरे लिए एक इलाज किया! –

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