2012-02-16 15 views
8

के बिना रीस्टकिट ऑब्जेक्ट मैपिंग रिलेशनशिप रीस्टकिट के लिए Object Mapping-Guide on GitHub पढ़ने के बाद मेरी समस्या गायब नहीं हुई, इसलिए शायद कोई कह सकता है कि RestKit निम्न विचार से निपट सकता है या नहीं। रिश्तेकेवीसी

Company 
- unitID 
- companyID 
- name 
- contacts* (Company -->> Contact | 1:n) 

Contact 
- unitID 
- companyID 
- contactID 
- lastName 
- firstName 
- account* (Contact >--> Company | 1:1) 

JSON (कंपनी) के साथ

संस्थाओं

[ 
    { 
     "unitID":"003CABD8DEB5DC13C", 
     "companyID":"BSP-002999", 
     "name":"Testcompany" 
    } 
] 

JSON (संपर्क)

[ 
    { 
     "unitID":"DAC2ACCC125795D00", 
     "companyID":"BSP-002999", 
     "contactID":"CLP-015468", 
     "firstName":"Mister", 
     "lastName":"Wayne" 
    } 
] 

सीमाओं के कारण मैं कंपनियों में संबंधित संपर्कों को घोंसला नहीं कर पा रहा हूं (अन्यथा मैं इसे नहीं लिखूंगा), इसलिए जब मैं आयात पर डेटा मैप किया जाता हूं तो मैं यह उपयोग करना चाहता हूं।

प्रश्न

यह कंपनी RestKit द्वारा दिए गए तरीकों के साथ आयात पर (विशेषता companyID द्वारा की पहचान) संबंधित है के लिए प्रत्येक संपर्क मैप करने के लिए संभव है?

यदि नहीं, तो मैं इसके लिए सबसे अच्छा समाधान जानना चाहता हूं। धन्यवाद!


पृष्ठभूमि

इस एप्लिकेशन के अपने पहले निर्माण में मैं दिया संस्थाओं के लिए वस्तुओं (रिश्तों के बिना) एक कंपनी को विधेय companyID साथ मैप किया और दिलवाया गया है सभी संबंधित संपर्कों =% @। डेटा की मात्रा (4000+ कंपनियां, 7000+ संपर्क) के कारण सभी संबंधित संपर्कों को लाने में लगभग एक सेकंड लगता है - इसलिए मैं संबंधों का उपयोग करने के विचार के साथ आया (जो स्थानीय डमी डेटा के साथ सही काम करता है)।


समाधान

मेरे वर्तमान मानचित्रण नीचे दिए गए जवाब की मदद से निम्नलिखित (RestKit v.10) की तरह दिखता है।

// Setting up Restkit with objectStore 
... 

// Init objectMapping for Class Company 
companyMapping = [RKManagedObjectMapping mappingForClass:[Company class] inManagedObjectStore:objectStore]; 
[companyMapping mapKeyPath:@"unitID" toAttribute:@"unitID"]; 
[companyMapping mapKeyPath:@"companyID" toAttribute:@"companyID"]; 
[companyMapping mapKeyPath:@"name" toAttribute:@"name"]; 
companyMapping.setDefaultValueForMissingAttributes = NO; 
companyMapping.primaryKeyAttribute = @"companyID"; 

// Init objectMapping for Class Contact 
contactMapping = [RKManagedObjectMapping mappingForClass:[Contact class] inManagedObjectStore:objectStore]; 
[contactMapping mapKeyPath:@"unitID" toAttribute:@"unitID"]; 
[contactMapping mapKeyPath:@"companyID" toAttribute:@"companyID"]; 
[contactMapping mapKeyPath:@"contactID" toAttribute:@"contactID"]; 
[contactMapping mapKeyPath:@"lastName" toAttribute:@"lastName"]; 
[contactMapping mapKeyPath:@"firstName" toAttribute:@"firstName"]; 
contactMapping.setDefaultValueForMissingAttributes = NO; 
contactMapping.primaryKeyAttribute = @"contactID"; 

// Init relationships 
[contactMapping mapRelationship:@"company" withMapping:companyMapping]; 
[contactMapping connectRelationship:@"company" withObjectForPrimaryKeyAttribute:@"companyID"]; 

// Get objects from server 
... 

+0

आप इस उदाहरण के अपने काम समाधान का हिस्सा कर सकते हैं? :) बस मैपिंग के लिए –

+2

एक उदाहरण कॉन्फ़िगरेशन के साथ उपरोक्त मेरी प्रविष्टि को अपडेट किया गया। आशा करता हूँ की ये काम करेगा! – flashfabrixx

उत्तर

12

हाँ, RestKit मानचित्रण समय में आप के लिए इस रिश्ते को हाइड्रेट कर सकते हैं।

  • मूल कंपनी को एक रिश्ते मैपिंग जोड़ें: [objectMapping mapRelationship:@"company" withMapping:companyMapping]
  • अपने संपर्क मॉडल
  • पर मानचित्र companyID विशेषता यह सुनिश्चित है कि आप अपने संपर्क मॉडल के लिए अपने RKManagedObjectMapping पर, आप निम्न करने की आवश्यकता होगी primaryKeyAttribute दोनों वर्गों
  • आज्ञा RestKit पर कॉन्फ़िगर संबंध हाइड्रेट करने के लिए: [objectMapping connectRelationship:@"company" withObjectForPrimaryKeyAttribute:@"companyID"];

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

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

RestKit मेलिंग सूची के लिए मेरी पोस्ट से अतिरिक्त विवरण: http://groups.google.com/group/restkit/msg/416951f86b2862d1

+0

आपके तेज़ रीप्ले के लिए धन्यवाद - यह एक आकर्षण की तरह काम करता है! मैं अब गिटहब/Google पर प्रोजेक्ट देख रहा हूं, क्योंकि आप इस परियोजना के लिए दूसरा विचार बहुत अच्छा प्रतीत होता है। – flashfabrixx

+0

आपने मेरा दिन बचाया! :) ऐसा लगता है कि आपको अपनी इकाई में एक विदेशी कुंजी की आवश्यकता है जो उस मूल इकाई को इंगित करता है जिसे आप हाइड्रेट करना चाहते हैं। वैसे भी, मैं सभी प्रकार के दस्तावेज़ों और उदाहरणों के माध्यम से चला गया लेकिन मुझे यह नहीं पता कि यह कैसे काम करता है। यह काम अब तक काम करने के तरीके के बारे में अब तक का सबसे अच्छा स्पष्टीकरण है! – Hlung

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