2013-02-03 33 views
36

पर नामित प्रारंभकर्ता को कॉल करने में विफल मुझे कोरडाटा के साथ थोड़ा सा समस्या है। मैं एक नया ऑब्जेक्ट डालना चाहता हूं, इसलिए मुझे पहले एक बनाना होगा।कोरडाटा: त्रुटि: NSManagedObject क्लास

Challenges *newChallenge = [[Challenges alloc] init]; 
[newChallenge setName:@"TestChallenge"]; 
[newChallenge setRounds:[[NSNumber alloc] initWithInt:12]]; 
[newChallenge setShots:[[NSNumber alloc] initWithInt:5]]; 
[newChallenge setDate:[NSDate date]]; 

लेकिन फिर भी alloc init के बाद मैं इस त्रुटि मिलती है:

CoreData: error: Failed to call designated initializer on NSManagedObject class 'Challenges' 

क्या हैक गलत हो रहा है, तो यह है कि कोड द्वारा किया जाता है?

उत्तर

58

मुझे लगता है कि समस्या यह है कि चुनौतियां एक NSManagedObject वर्ग है और आपने निर्धारित प्रारंभकर्ता की जरूरत है:

initWithEntity:insertIntoManagedObjectContext: 
बजाय

Challenges *newChallenge = [[Challenges alloc] init]; 

Read More..

+1

मैं तुम्हें मतलब * नामित * प्रारंभकर्ता लगता है यहाँ कैसे आप बॉयलरप्लेट में कटौती कर सकते हैं और अपने कोड अधिक पठनीय बनाने के लिए है। – jlehr

+1

@jiehr: बेशक मेरा मतलब नामित प्रारंभकर्ता - बहुत धन्यवाद! (मैंने जवाब संपादित किया है) – duDE

13

NSManagedObject सिर्फ alloc/init नहीं किया जा सकता जैसे आप आमतौर परके साथ करेंगे। तथ्य की बात के रूप में नामित प्रारंभकर्ता है: initWithEntity:insertIntoManagedObjectContext:

अब वास्तविक त्रुटि के लिए, एप्पल states in the documentation कि:

Important: This method is the designated initializer for NSManagedObject. You must not initialize a managed object simply by sending it init.

तो, आप देख सकते हैं कि आप यह प्रारंभ करने में 2 बातें की जरूरत है, एक NSEntityDescription (आप जिस इकाई को तत्काल करने का इरादा रखते हैं) और NSManagedObjectContext (संदर्भ जिसमें नई वस्तु बनाई जाएगी)।

-(void) awakeFromInsert { 
    self.date = [NSDate date]; 
    self.rounds = @(12); 
    self.shots = @(5); 
} 

प्रत्येक नया ऑब्जेक्ट को उसके जन्म से उन विशेषताओं को परिभाषित कर पाएँगे:

4

Additionaly, यदि आपका चुनौतियां वर्ग NSManagedObject और तिथि है, राउंड और शॉट्स उसके गुण के रूप में आप विधि जोड़ सकते हैं परिभाषित कर रहे हैं।

30

यदि आप खुद से पूछें "ठीक है, तो मैं उस इकाई को कैसे प्राप्त करूं?" (जैसे मैंने किया था), तो आप ऐसा तरह entityForName विधि का उपयोग कर ऐसा करते हैं:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Challenges" inManagedObjectContext:self.managedObjectContext]; 

Challenges *newChallenge = [[Challenge alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext]; 

आशा इस मदद करता है, इस सूत्र ने मुझे एक बहुत मदद की है!

+0

यह मेरे लिए काम करता है, लेकिन क्यों ?? – Allan

4

अन्य ने पहले से ही कहा है कि यह क्यों काम नहीं कर रहा है।

@implementation NSManagedObject(MyPrivateAdditions) 

+ (id)insertNewObjectInContext:(NSManagedObjectContext *)context 
{ 
    return [NSEntityDescription insertNewObjectForEntityForName:self.className inManagedObjectContext:context]; 
} 

@end 

अब आप कर सकते हैं:

Challenges *newChallenge = [Challenge insertNewObjectInContext:context]; 
+0

यह स्वीकार्य उत्तर होना चाहिए –