Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Mobile Development

स्क्रैच से मुख्य डेटा: संबंध और अधिक दिलकश

by
Read Time:13 minsLanguages:
This post is part of a series called Core Data from Scratch.
Core Data from Scratch: Managed Objects and Fetch Requests
Core Data from Scratch: NSFetchedResultsController

Hindi (हिंदी) translation by Ade Khairul Umam (you can also view the original English article)

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

1. रिश्ते

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

एक व्यक्ति के पते लाने के लिए, हम बस valueForKey आह्वान: व्यक्ति पर, NSManagedObject का एक उदाहरण है, और कुंजी के रूप में पतों में पास । ध्यान दें कि पते कुंजी हम डेटा मॉडल में परिभाषित किया गया है । आप किस प्रकार के ऑब्जेक्ट की अपेक्षा करते हैं? अधिकांश कोर डेटा के लिए नए लोगों को एक हल NSArray की उंमीद है, लेकिन कोर डेटा एक NSSet, जो unसॉर्टेड है देता है । NSSet के साथ काम करने के रूप में आप बाद में सीखना होगा अपने फायदे हैं ।

रिकॉर्ड बना रहा है

सिद्धांत के साथ पर्याप्त है, पिछले लेख से परियोजना को खोलने या GitHub से क्लोन । चलो एक व्यक्ति को बनाने और फिर इसे एक पते से लिंक द्वारा शुरू करते हैं । किसी व्यक्ति को बनाने के लिए, अनुप्रयोग अद्यतन: didFinishLaunchingWithOptions: विधि के रूप में नीचे दिखाया गया है ।

यदि आप पिछले लेख पढ़ा है यह परिचित दिखना चाहिए । एक पता बनाना जैसा कि आप नीचे देख सकते है जैसा दिखता है ।

क्योंकि पता एंटिटी की प्रत्येक विशेषता वैकल्पिक के रूप में चिह्नित है, इसलिए हमें प्रत्येक विशेषता को एक मान असाइन करने की आवश्यकता नहीं है । उपरोक्त उदाहरण में, हम केवल रिकॉर्ड की सड़क और शहर की विशेषताएं सेट करते हैं ।

संबंध बनाना

newPerson करने के लिए newAddress लिंक करने के लिए, हम setValue: forKey:, कुंजी के रूप में पतों में गुजर आह्वान । मान है कि हम में पास एक NSSet जिसमें newAddress है । स्पष्टीकरण के लिए निंन कोड खंड पर एक नज़र रखना ।

हम कॉल सहेजें: प्रबंधित ऑब्जेक्ट के संदर्भ पर newPerson ऑब्जेक्ट निर्बाध संग्रह करने के लिए परिवर्तन प्रोपेगेट करने के लिए । याद रखें कि कॉलिंग सहेजें: प्रबंधित ऑब्जेक्ट प्रसंग पर प्रबंधित ऑब्जेक्ट प्रसंग की स्थिति सहेजता है । इसका मतलब यह है कि newAddress भी समर्थन की दुकान पर लिखा है के रूप में के रूप में अच्छी तरह से संबंधों को हम अभी परिभाषित किया ।

तुम सोच हो सकता है इसलिए हम newPerson newAddress से लिंक नहीं किया, क्योंकि हम अपने डेटा मॉडल में एक व्युत्क्रम संबंध को परिभाषित था । कोर डेटा हमारे लिए इस संबंध बनाता है । यदि एक रिश्ता एक व्युत्क्रम रिश्ता है, तो कोर डेटा इस का स्वचालित रूप से ख्याल रखता है । आप अपने व्यक्तियों के लिए newAddress वस्तु पूछ द्वारा यह सत्यापित कर सकते हैं ।

संबंध ला रहा है और अद्यतन कर रहा है

एक रिश्ते को अद्यतन करना मुश्किल भी नहीं है । केवल चेतावनी है कि हम या जोड़ने के लिए अपरिवर्तनीय NSSet उदाहरण कोर डाटा हाथ से हमें तत्वों को हटाने की जरूरत है । इस कार्य को आसान बनाने के लिए, हालांकि, NSManagedObject एक सुविधा विधि mutableSetValueForKey:, जो एक NSMutableSet ऑब्जेक्ट देता है घोषित करता है । हम तो बस जोड़ सकते है या संग्रह से एक आइटम को हटाने के संबंध अद्यतन करें ।

निम्न कोड ब्लॉक जिसमें हम कोई अन्य पता बनाएँ और इसे newPerson के साथ संबद्ध पर एक नज़र डालें. हम mutableSetValueForKey लागू करने के द्वारा यह करते हैं: newPerson पर और परिवर्तनशील सेट करने के लिए otherAddress जोड़ने । हम संबंध अद्यतन किया है कि कोर डेटा बताने की जरूरत नहीं है. कोर डेटा परिवर्तनशील सेट का ट्रैक रखता है कि यह हमें दिया था और तदनुसार संबंध अद्यतन करता है ।

कोई संबंध हटाना

किसी संबंध को हटाना setValue इनवोक करने के रूप में सरल है: forKey:, मूल्य और कुंजी के रूप में संबंध के नाम के रूप में शूंय में गुजर रहा है । इससे newPerson से हर पता अनलिंक हो जाता है ।

2. एक-से-एक और एक-एक कर कई रिश्ते

एक-से-एक रिश्ते

भले ही हमारा डेटा मॉडल एक-से-एक संबंध को परिभाषित नहीं करता, लेकिन आपने इस प्रकार के संबंधों के साथ काम करने के लिए आपको जो भी जानना आवश्यक है वह सब कुछ सीखा है. विशेषताओं के साथ कार्य करने के लिए एक-से-एक संबंध के साथ कार्य करना समान है । फर्क सिर्फ इतना है कि आप valueForKey से वापस मान: और मूल्य आप setValue के पास: forKey: एक NSManagedObject उदाहरण है ।

चलो हमारे डेटा मॉडल को अद्यतन करने के लिए यह वर्णन । Core_Data. xcdatamodeld खोलें और व्यक्ति एंटिटी का चयन करें । एक नया रिश्ता बनाएं और इसे पति का नाम । व्यक्ति एंटिटी को गंतव्य के रूप में सेट करें और जीवनसाथी का संबंध व्युत्क्रम संबंध के रूप में सेट करें ।

जैसा कि आप देख सकते हैं, यह पूरी तरह से एक रिश्ता है जिसमें रिश्ते की मंजिल इकाई है कि रिश्ते को परिभाषित करने के रूप में एक ही इकाई है बनाने के लिए संभव है । यह भी ध्यान दें कि हम हमेशा रिश्ते का व्युत्क्रम सेट । प्रलेखन राज्यों के रूप में, वहां बहुत कुछ स्थितियों में आप एक रिश्ता है कि एक व्युत्क्रम संबंध नहीं है बनाना चाहते हैं ।

आप का निर्माण और आवेदन चलाने के लिए थे, तो क्या होगा पता है? यह सही है, आवेदन दुर्घटना होगी । चूंकि हमने डेटा मॉडल परिवर्तित कर दिया है, इसलिए इस उदाहरण में मौजूदा स्टोर, SQLite डेटाबेस अब डेटा मॉडल के साथ संगत नहीं है । यह उपाय करने के लिए, अपने डिवाइस या iOS सिम्युलेटर से आवेदन को हटाने और आवेदन चलाते हैं । हालांकि चिंता मत करो, हम एक भविष्य किस्त में और अधिक सुरुचिपूर्ण ढंग से इस समस्या का हल प्रवास का उपयोग करेंगे ।

यदि आप समस्याओं के बिना आवेदन चला सकते हैं, तो यह अगले कदम के लिए समय है । वापस अनुप्रयोग प्रतिनिधि वर्ग के लिए सिर और निम्न कोड ब्लॉक जोड़ें ।

newPerson के पति के रूप में anotherPerson सेट करने के लिए, हम setValue आह्वान: forKey: newPerson पर और anotherPerson में पास और तर्क के रूप में "पति" @ । हम setValue: forKey: पर anotherPerson और newPerson में गुजर रहा है और @ "पति" बहस के रूप में लागू करके एक ही परिणाम प्राप्त कर सकते हैं ।

एक-से-कई रिश्ते

चलिए एक नज़र से खत्म करते हैं एक-से-कई रिश्तों को. Core_Data. xcdatamodeld खोलें, व्यक्ति एंटिटी का चयन करें, और बच्चों के नाम का संबंध बनाएं । व्यक्ति के लिए गंतव्य सेट करें, कई करने के लिए प्रकार सेट करें, और व्युत्क्रम संबंध अभी के लिए खाली छोड़ दें ।

पिता नाम का एक और रिश्ता बनाएं, व्यक्ति को गंतव्य सेट करें, और व्युत्क्रम संबंध बच्चों के लिए सेट करें । यह स्वतः ही बच्चों के रिश्ते हम खाली छोड़ एक पल पहले के व्युत्क्रम रिश्ता आबाद होगा । अब हम एक-से-अनेक संबंध बना चुके हैं, अर्थात, एक पिता के कई बच्चे हो सकते हैं, लेकिन एक बच्चा केवल एक ही पिता हो सकता है ।

वापस अनुप्रयोग प्रतिनिधि के लिए सिर और निम्न कोड ब्लॉक जोड़ें । हम एक और व्यक्ति रिकॉर्ड बनाने के लिए, अपनी विशेषताओं सेट, और newPerson के एक बच्चे के रूप में यह महत्वपूर्ण बच्चों के लिए एक परिवर्तनशील सेट के लिए कोर डेटा पूछ रही है और परिवर्तनशील सेट करने के लिए नए रिकॉर्ड जोड़ने से सेट ।

निंन कोड खंड anotherChildPerson के पिता विशेषता सेट करके उसी परिणाम को पूरा । इसका परिणाम यह होता है कि newPerson anotherChildPerson का पिता बन जाता है और anotherChildPerson newPerson का बच्चा बन जाता है ।

3. अधिक दिलकश

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

सॉर्ट वर्णनकर्ता

हम प्रबंधित ऑब्जेक्ट प्रसंग से वापस प्राप्त रिकॉर्ड को सॉर्ट करने के लिए, हम NSSortDescriptor वर्ग का उपयोग करें । निम्न कोड स्निपेट पर एक नज़र डालें.

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

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

कोड ब्लॉक के बाकी परिचित दिखना चाहिए । फ़ेच अनुरोध प्रबंधित ऑब्जेक्ट प्रसंग, जो जब हम executeFetchRequest प्रारंभ करें फ़ेच अनुरोध निष्पादित करता है करने के लिए दिया गया है: त्रुटि: । यह हमेशा एक NSError ऑब्जेक्ट के लिए एक सूचक में पास करने के लिए महत्वपूर्ण है पता है कि यदि प्राप्ति अनुरोध का निष्पादन विफल हो गया है ।

अनुप्रयोग चलाएं और Xcode के कंसोल में आउटपुट का निरीक्षण करें । उत्पादन क्या नीचे दिखाया गया है के समान दिखना चाहिए । जैसा कि आप देख सकते हैं, रिकॉर्ड उनके प्रथम नाम द्वारा सॉर्ट किए जाते हैं ।

यदि आप आउटपुट में डुप्लिकेट देखते हैं, तो कोड हम पहले लिखा रिकॉर्ड बनाने के लिए बाहर टिप्पणी करने के लिए सुनिश्चित करें । हर बार जब आप अनुप्रयोग चलाते हैं, तो समान रिकॉर्ड्स बनाए जाते हैं, जिसके परिणामस्वरूप डुप्लिकेट रिकॉर्ड्स बनते हैं.

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

आउटपुट दिखाता है कि सरणी में सॉर्ट वर्णनकर्ता का क्रम महत्वपूर्ण है । रिकॉर्ड पहले उनके अंतिम नाम और फिर उनकी उंर के द्वारा हल कर रहे हैं ।

Predicates

क्रमबद्ध वर्णनकर्ता महान और उपयोग करने के लिए आसान कर रहे हैं, लेकिन predicates क्या वास्तव में कोर डेटा में शक्तिशाली दिलकश बनाता है. जबकि सॉर्ट वर्णनकर्ता मूल डेटा को बता सकते हैं कि रिकॉर्ड्स को कैसे सॉर्ट किया जाना चाहिए, predicates यह बताएँ कि आपकी रुचि में कौन से रिकॉर्ड हैं. वर्ग हम के साथ काम कर रहा हूं NSPredicate है ।

डो परिवार के हर सदस्य को दिलवाया द्वारा चलो शुरू करो । यह बहुत आसान है और वाक्यविंयास एसक्यूएल के आप में से कुछ याद दिलाना होगा ।

हम predicateWithFormat इनवोक करके एक NSPredicate वस्तु बनाने के अलावा बहुत कुछ नहीं बदला है: और यह एक setPredicate के एक तर्क के रूप में पारित द्वारा लाने के अनुरोध को predicate बांधने: कॉल । predicateWithFormat के पीछे विचार: stringWithFormat के समान है: में है कि यह तर्क की एक चर संख्या को स्वीकार करता है ।

नोट करें कि predicate स्वरूप स्ट्रिंग% K गुण नाम और% @ मान के लिए उपयोग करता है । Predicate प्रोग्रामिंग मार्गदर्शिका में कहा गया है,% K एक कुंजी पथ के लिए चर तर्क प्रतिस्थापन है जबकि% @ किसी ऑब्जेक्ट मान के लिए चर तर्क प्रतिस्थापन है । इसका मतलब यह है कि हमारे उदाहरण के predicate स्वरूप स्ट्रिंग पिछले = = "डो" के लिए मूल्यांकन करता है ।

आप एक और अधिक समय अनुप्रयोग चलाते हैं और Xcode के कंसोल में आउटपुट का निरीक्षण करते हैं, तो आप निम्न परिणाम देखना चाहिए:

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

निंनलिखित predicate है कि हम कैसे उपयोग कर सकते है > = ऑपरेटर केवल एक आयु विशेषता के साथ व्यक्ति रिकॉर्ड लाने के लिए 30 से अधिक है ।

हम भी स्ट्रिंग तुलना के लिए ऑपरेटरों है, शामिल हैं, जैसे, मैच, BEGINSWITH, और ENDSWITH. आइए हर उस व्यक्ति का रिकॉर्ड लायें, जिसका नाम अक्षर j होता है.

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

तुम भी यौगिक predicates खोजशब्दों का उपयोग कर बना सकते है और, या, और नहीं । निम्नलिखित उदाहरण में, हम प्रत्येक व्यक्ति जिसका प्रथम नाम अक्षर j शामिल है और 30 से छोटा है लायें ।

Predicates भी अपने रिश्ते के आधार पर रिकॉर्ड लाने के लिए बहुत आसान बना । निंनलिखित उदाहरण में, हम हर उस व्यक्ति को प्राप्त करते है जिसके पिता का नाम बार्ट के बराबर है ।

उपरोक्त predicate अपेक्षा के अनुरूप काम करता है, क्योंकि% K एक महत्वपूर्ण पथ के लिए एक परिवर्तनीय तर्क प्रतिस्थापन है, न कि केवल कुंजी ।

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

वहां क्या मैं तुंहें इस लेख में दिखाया गया है से predicates के लिए बहुत अधिक है । यदि आप predicates के बारे में अधिक जानने के लिए चाहते हैं, मैं सुझाव है कि आप एप्पल Predicate प्रोग्रामिंग गाइड में एक चोटी ले लो । हम भी इस श्रृंखला के अगले कुछ लेख में predicates के साथ और अधिक काम करेंगे ।

निष्कर्ष

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

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.