2009-07-27 23 views
6

में वैकल्पिक NSNumber संग्रहीत करना मेरे मूल डेटा मॉडल में, मेरे पास एक वैकल्पिक NSNumber विशेषता वाला एक इकाई है।कोर डेटा

मैं यह देखने के लिए कैसे परीक्षण करूं कि उस विशेषता का मान वैध है या नहीं?

जब मैं शून्य के लिए परीक्षण करता हूं ... काम नहीं करता है।

[self numberAttribute] == nil // always returns NO 

जब मैं शून्य मान int के लिए परीक्षण करता हूं, तो यह काम नहीं करता है।

[[self numberAttribute] intValue] == 0 // always returns no 

तथ्य की बात के रूप में, [[आत्म numberAttribute] intValue]] रिटर्न कुछ है कि संदेह से एक स्मृति पते पर एक सूचक की तरह दिखता है।

किसी को भी कोई विचार है कि मैं क्या गलत कर रहा हूं?

संपादित करें: ठीक है, बग कोड के पूरी तरह से असंबंधित हिस्से में था। NSNumber और कोर डेटा ठीक उसी तरह काम कर रहे हैं जैसा कि कोई उम्मीद करेगा। उस ने कहा, मैं विशेषता को गैर-वैकल्पिक बनाने और डिफ़ॉल्ट मान के रूप में 0 निर्दिष्ट करने के सुझाए गए दृष्टिकोण के साथ जाने जा रहा हूं।

इस प्रश्न को देख रहे किसी भी व्यक्ति के लिए बस थोड़ी देर के लिए इस नोट को यहां डालें, तो मैं इसे हटा रहा हूं।

+1

मेरे पास अभी तक संपादित करने के लिए पर्याप्त प्रतिनिधि नहीं है, लेकिन आपके दूसरे कोड उदाहरण में असंतुलित ब्रैकेट (2 उद्घाटन ब्रैकेट और 3 समापन) हैं। – Mark

+0

बहुत धन्यवाद। फिक्स्ड। – mmc

+0

संख्या एट्रिब्यूट डेटा मॉडल में एक फ्लोट के रूप में निर्दिष्ट है? संख्या एट्रिब्यूट की संपत्ति कैसे घोषित की गई है? वे एक्सेसर कार्यान्वयन क्या दिखते हैं (यदि आप @ गतिशील एक्सेसर्स का उपयोग नहीं कर रहे हैं।) इस जानकारी के बिना, आपका प्रश्न सटीक उत्तर देना असंभव है। –

उत्तर

0

यदि आपको पॉइंटर की तरह दिखने वाला एक बड़ा मूल्य मिल रहा है, तो शायद यह NaN (संख्या नहीं) है?

यदि हां, तो आप के साथ जांच कर सकता है:,

isnan([[self numberAttribute] doubleValue]) 

या संभवतः यह NSNotFound की तर्ज (हालांकि शायद और अधिक कोर डाटा विशिष्ट) के साथ कुछ अन्य स्थिर है।

+0

इस तकनीक के कई अलग-अलग स्वादों का प्रयास किया, काम नहीं किया। जो मूल्य मैं प्राप्त कर रहा हूं वह निरंतर नहीं है, और यह डीबगर (सारांश कॉलम) में "अमान्य" के रूप में रिपोर्ट करता है। यह काफी विचित्र है, मैंने माना कि क्या मैंने विशेषता को सेट नहीं किया है, और यदि इसे .xcdatamodel में "0" के डिफ़ॉल्ट मान के साथ "वैकल्पिक" के रूप में चिह्नित किया गया था, तो यह पूरा करना मुश्किल नहीं होगा। – mmc

+0

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

+0

मैंने किसी अन्य व्यक्ति के साथ चेक किया है जिसमें वैकल्पिक गुणों के साथ एक कोर कोर प्रोजेक्ट है - उसने सोचा कि वास्तव में एक अनसेट मान शून्य होना चाहिए, जैसे आप की जांच कर रहे थे। इसलिए मैं इस सिद्धांत के साथ जाऊंगा कि आप एनएसएनंबर ऑब्जेक्ट वापस ले रहे हैं क्योंकि पॉर्नईएल पोस्टलेटिंग कर रहा था। –

5
documentation के अनुसार

,

आप निर्दिष्ट कर सकते कि एक विशेषता वैकल्पिक-वह यह है कि है, यह एक मूल्य के लिए आवश्यक नहीं है। आम तौर पर, हालांकि, आप ऐसा करने से निराश होते हैं-खासकर संख्यात्मक मानों के लिए (आमतौर पर आप मॉडल के 0 में डिफ़ॉल्ट मान के साथ एक अनिवार्य विशेषता का उपयोग करके बेहतर परिणाम प्राप्त कर सकते हैं)। इसका कारण यह है कि एसक्यूएल के पास एनयूएलएल के लिए विशेष तुलना व्यवहार है जो उद्देश्य-सी के शून्य के विपरीत है। डेटाबेस में पूर्ण 0 जैसा नहीं है, और 0 के लिए खोज न्यूल के साथ कॉलम से मेल नहीं खाती है।

false == (NULL == 0) 
false == (NULL != 0) 

इसके अलावा, एक डेटाबेस में शून्य, एक खाली स्ट्रिंग या खाली डेटा ब्लॉब के बराबर नहीं है या तो:

false == (NULL == @"") 
false == (NULL != @"") 

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

संपादित करें: ऊपर मेरी टिप्पणी देखें। मैंने एक वैकल्पिक विशेषता वाले सेट के साथ एक नई प्रबंधित ऑब्जेक्ट बनाने की कोशिश की, और यह शून्य था।

BOOL isNil = ([newManagedObject numberAttribute] == nil); //equals YES 

एक और संपादित करें: मैं वापस इस पर बाद में आए और एक वस्तु डीबगर में कैश से भरी हुई चेक आउट (gdb अपने दोस्त है!)। यह स्मृति स्थान 0x0 तक पहुंचने का प्रयास कर रहा था, जो पूर्ण है।

+0

हां, लेकिन असली सवाल यह है कि यदि आपके पास एक विशेषता घोषित वैकल्पिक है - आप यह देखने के लिए कैसे जांचते हैं कि यह सेट है या नहीं? –

+0

सच है। मैंने अपने उत्तर में कुछ और जांच और विस्तार किया। – Don

+0

अब मैं सहमत हूं कि यह उचित जांच है, रहस्य यह है कि वह शून्य नहीं हो रहा है लेकिन कुछ अजीब मूल्य ... –

0

यदि यह सूचक की तरह दिखता है, तो यह NSNumber उदाहरण के लिए एक सूचक हो सकता है। सुनिश्चित करें कि आपके पास कोर डेटा मॉडल और कक्षा के बीच मेल नहीं है (उदा। NSInteger जहां NSNumber* अपेक्षित है)।

यदि आपके पास अपनी कक्षा में स्केलर है, तो आपको यह ध्यान रखना होगा कि setNilValueForKey: में।

+1

यह मेरे लिए एक अच्छी तरह से प्रतीत होता है (नहीं कि उस भयानक टोपी वाले किसी भी व्यक्ति को बैकअप की आवश्यकता है)। –