(अस्वीकरण:। मैं क्षेत्र के लिए काम)
हां! दायरे में प्राथमिक कुंजी सेट करना अनिवार्य नहीं है, न ही आवश्यक है, यही कारण है कि यह डेवलपर और ऐप की आवश्यकताओं को पूरी तरह से निर्धारित करने के लिए है कि यह आवश्यक है या नहीं, इसके कार्यान्वयन में है या नहीं।
अपने प्रश्नों के जवाब में:
1) कोई डिफ़ॉल्ट मान रहे हैं; आप प्राथमिक कुंजी के रूप में अपनी खुद की संपत्तियों में से एक निर्दिष्ट करते हैं। primaryKey
डिफ़ॉल्ट रूप से शून्य लौटाता है क्योंकि आपको उस क्षेत्र को इंगित करने के लिए स्वयं को ओवरराइड करने की आवश्यकता है, जिसे आप प्राथमिक कुंजी के रूप में कार्य करना चाहते हैं। कुछ उपयोगकर्ताओं ने प्राथमिक कुंजी के रूप में पूर्णांक सेट किए हैं, लेकिन अधिकतर नहीं, यूयूआईडी स्ट्रिंग का उपयोग करना सबसे आम है।
2) कोई अंतर्निहित प्राथमिक कुंजी नहीं है। आपको [RLMObject primaryKey]
विधि का स्पष्ट रूप से यह बताने के लिए उपयोग करना होगा कि कौन सी संपत्ति प्राथमिक कुंजी है, और फिर इसे अनुक्रमित किया जाएगा। :)
3) मेरे अपने (अतिरिक्त समय) विकास अनुभव में, मैं आम तौर पर एक प्राथमिक कुंजी होने यह बहुत आसान की पहचान करने और विशिष्ट वस्तुओं को संभालने के लिए बनाता है पाते हैं। उदाहरण के लिए, यदि आप थ्रेड में किसी ऑब्जेक्ट को पास कर रहे हैं, तो आप ऑब्जेक्ट को रीफेट करने के लिए प्राथमिक कुंजी मान को पास कर सकते हैं और [RLMObject objectForPrimaryKey:]
का उपयोग कर सकते हैं। जाहिर है यह आपकी अपनी कार्यान्वयन आवश्यकताओं पर निर्भर करता है। आपको शायद प्राथमिक कुंजी नहीं जोड़नी चाहिए जबतक कि आपको पता न लगे कि आपको वास्तव में एक की आवश्यकता है।
एक उदाहरण के रूप में, यहाँ आप अपने RLMObject उपवर्ग को जोड़ना होगा क्या अगर आप एक प्राथमिक कुंजी के रूप में एक UUID स्ट्रिंग सेट करने के लिए चाहता था:
@interface MyObject : RLMObject
@property NSString *uuid;
@end
@implementation MyObject
+ (NSString *)primaryKey
{
return @"uuid";
}
+ (NSDictionary *)defaultPropertyValues
{
@{@"uuid": [[NSUUID UUID] UUIDString]};
}
@end
मुझे आशा है कि मदद की!
परिशिष्ट: नीचे की गई टिप्पणियों में से कुछ पर विस्तार से बता दें प्राथमिक कुंजी स्पष्ट रूप से किसी भी क्षेत्र में ऐसे API पर एक ही कुंजी के साथ एक वस्तु पहले से ही डेटाबेस में मौजूद रहने पर निर्भर करता है उनकी कार्यक्षमता को बदलने के लिए आवश्यक हैं। उदाहरण +[RLMObject createOrUpdateInRealm:]
के लिए डेटाबेस के लिए एक नया क्षेत्र वस्तु जोड़ देगा, अगर है कि प्राथमिक कुंजी के साथ एक वस्तु को पहले से ही मौजूद नहीं है, और बस अन्यथा मौजूदा ऑब्जेक्ट अद्यतन करेगा।
ऐसे मामलों में, जहां प्राथमिक कुंजी बाद के तर्क का एक महत्वपूर्ण घटक है, उन्हें आवश्यक है। हालांकि, चूंकि ये एपीआई विभिन्न तरीकों का एक सबसेट है जिसमें रीयलम में डेटा जोड़ने/अपडेट करना संभव है, यदि आप उनका उपयोग नहीं करना चुनते हैं, तो आपको अभी भी प्राथमिक कुंजी की आवश्यकता नहीं है।
धन्यवाद टिम। यह भी पाया गया है कि 'addOrUpdateObject:' विधि को करने का प्रयास करते समय पीके के बिना ऑब्जेक्ट अपडेट नहीं किया जा सकता है, दायरे में 'आरएलएमईएक्सप्शन' बढ़ता है, कारण: 'YourClass' में प्राथमिक कुंजी नहीं है और इसे अपडेट नहीं किया जा सकता है ' – David
कोई चिंता नहीं! ओह! मैं वास्तव में यह नहीं जानता था। मैंने माना कि अगर आपने प्राथमिक कुंजी को परिभाषित नहीं किया है तो यह हर बार वस्तुओं को जोड़ने के लिए डिफॉल्ट किया जाता है। उसके लिए धन्यवाद! – TiM
ने टिप्पणी की है कि @ डेविड पोस्ट, और अभी भी सहमत हैं, मुझे एक ही त्रुटि मिलती है। इसलिए, यदि आपको ऑब्जेक्ट को अपडेट करने की आवश्यकता है तो आपको ** प्राथमिक कुंजी सेट करनी होगी। संशोधित करके आपका जवाब चाहिए? – Idan