2015-09-01 11 views
16

मैंने देखा है कि पीके सेटिंग रीयल में अनिवार्य नहीं है और इसे छोड़ा जा सकता है। लेकिन दस्तावेज़ीकरण में कहा गया है कि:क्या मुझे दायरे में प्रत्येक इकाई के लिए प्राथमिक कुंजी परिभाषित करनी चाहिए?

इंडेक्स प्राथमिक कुंजी गुणों के लिए स्वचालित रूप से बनाए जाते हैं।

और मैं कुछ सवाल स्पष्ट करने के लिए करना चाहते हैं:

1) क्या पी के लिए डिफ़ॉल्ट मान, क्षेत्र द्वारा परिभाषित किया गया है, तो मैं इसे अपने आप से आवंटित नहीं है। क्या यह हैश या जो कुछ भी है? (यदि मैं पीके सेट नहीं करता हूं और [MyRealmObject primaryKey] पर कॉल करता हूं तो यह nil देता है)

2) यदि यह निहित पीके डिफ़ॉल्ट रूप से अनुक्रमित है? मैं इसके बारे में चिंता करना चाहिए, क्योंकि अगर यह अनुक्रमित नहीं है, इसका मतलब यह है कि यह इस इकाई के सामान्य प्रदर्शन को प्रभावित करता है कि (उदाहरण के लिए, वस्तुओं को लाते समय)?

3) क्या प्रत्येक बार RLMObject सबक्लास के लिए पीके को परिभाषित करना एक अच्छा अभ्यास है या यह वास्तविकता के लिए आवश्यक नहीं है और केवल रियलम द्वारा परिभाषित आंतरिक अहसास पर भरोसा कर सकता है?

उत्तर

14

(अस्वीकरण:। मैं क्षेत्र के लिए काम)

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

अपने प्रश्नों के जवाब में:

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:] के लिए डेटाबेस के लिए एक नया क्षेत्र वस्तु जोड़ देगा, अगर है कि प्राथमिक कुंजी के साथ एक वस्तु को पहले से ही मौजूद नहीं है, और बस अन्यथा मौजूदा ऑब्जेक्ट अद्यतन करेगा।

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

+5

धन्यवाद टिम। यह भी पाया गया है कि 'addOrUpdateObject:' विधि को करने का प्रयास करते समय पीके के बिना ऑब्जेक्ट अपडेट नहीं किया जा सकता है, दायरे में 'आरएलएमईएक्सप्शन' बढ़ता है, कारण: 'YourClass' में प्राथमिक कुंजी नहीं है और इसे अपडेट नहीं किया जा सकता है ' – David

+0

कोई चिंता नहीं! ओह! मैं वास्तव में यह नहीं जानता था। मैंने माना कि अगर आपने प्राथमिक कुंजी को परिभाषित नहीं किया है तो यह हर बार वस्तुओं को जोड़ने के लिए डिफॉल्ट किया जाता है। उसके लिए धन्यवाद! – TiM

+1

ने टिप्पणी की है कि @ डेविड पोस्ट, और अभी भी सहमत हैं, मुझे एक ही त्रुटि मिलती है। इसलिए, यदि आपको ऑब्जेक्ट को अपडेट करने की आवश्यकता है तो आपको ** प्राथमिक कुंजी सेट करनी होगी। संशोधित करके आपका जवाब चाहिए? – Idan

2

घोड़े को पहले ही मौत के लिए पीटा गया है, लेकिन मैं मदद नहीं कर सका, लेकिन रीयलम कोड को संदर्भित करता है जो एक प्राथमिक वस्तु के बिना एक रियल ऑब्जेक्ट बनाया या अपडेट किया गया है।

+ (instancetype)createOrUpdateInRealm:(RLMRealm *)realm withValue:(id)value { 
    // verify primary key 
    RLMObjectSchema *schema = [self sharedSchema]; 
    if (!schema.primaryKeyProperty) { 
     NSString *reason = [NSString stringWithFormat:@"'%@' does not have a primary key and can not be updated", schema.className]; 
     @throw [NSException exceptionWithName:@"RLMExecption" reason:reason userInfo:nil]; 
    } 
    return (RLMObject *)RLMCreateObjectInRealmWithValue(realm, [self className], value, true); 
} 
+0

इस विशेष एपीआई कॉल के लिए, हाँ प्राथमिक कुंजी संपत्ति की आवश्यकता है। ऐसा इसलिए है क्योंकि 'बनाम बनाम अद्यतन' व्यवहार को संभालने के लिए, यह कहना आवश्यक है कि यह ऑब्जेक्ट वास्तविकता में मौजूद है या नहीं (अन्यथा एक नई वस्तु को हर बार इसे जोड़ा जाने पर जोड़ा जाएगा)। लेकिन यह एपीआई रीयल में डेटा जोड़ने/बदलने का एकमात्र तरीका नहीं है, और यदि आप इसका उपयोग नहीं करते हैं, तो आपको अभी भी अपने ऑब्जेक्ट मॉडल में प्राथमिक कुंजी जोड़ने की आवश्यकता नहीं है। :) – TiM

+0

हाँ, यह समझ का एक टन बनाता है। धन्यवाद @ टीआईएम। –

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

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