2013-02-03 19 views
36

CoreData ile ilgili bir sorunum var. Yeni bir Nesne eklemek istiyorum, bu yüzden önce bir tane oluşturmalıyım.CoreData: error: NSManagedObject sınıfında belirtilen başlatıcıyı çağırılamadı

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

Ama bununla birlikte alloc init sonra bu hatayı alıyorum: kesmek yanlış

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

neler oluyor Bu durum koduna göre yapılır?

cevap

58

Sorun Zorluklar bir NSManagedObject sınıf olduğunu düşünüyorum ve belirlenen başlatıcı gerekir:

initWithEntity:insertIntoManagedObjectContext: 

yerine

Read More..

+1

Sana * belirlenen * başlatıcı anlamına düşünüyorum Burada boilerplate azaltmak ve kod daha okunabilir hale nasıl olduğunu. – jlehr

+1

@jiehr: Tabii ki başlatıcıyı kastediyordum - çok teşekkürler! (Cevabı düzenledim) – duDE

13

NSManagedObject

Challenges *newChallenge = [[Challenges alloc] init]; 
sadece alloc/ init olamaz normalde birile yapacağınız gibi. Nitekim olarak belirlenen başlatıcı geçerli: Şimdi initWithEntity:insertIntoManagedObjectContext:

, fiili hata için Apple states in the documentation o: Yani

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

varsayılırsa, başlatmak için 2 şeye ihtiyacımız olduğunu görebiliyordu, Bir NSEntityDescription (hangi nesneyi başlatmayı amaçladığınız) ve NSManagedObjectContext (yeni nesnenin oluşturulacağı bağlam). Her yeni nesne doğumdan itibaren bu özellikleri tanımlanmış olacaktır

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

: En Zorluklar sınıf NSManagedObject ve tarih ise

4

Additionaly, mermi ve silahların sen yöntemi ekleyebilirsiniz onun niteliklerini olarak tanımlanmaktadır.

30

Kendinize "Tamam, bu varlığı nasıl elde edebilirim?" Diye sormanız halinde. (Ben gibi), bunu böyle entityForName yöntemini kullanarak bunu: Bu yardımcı olur

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

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

Umut Konuyu bana çok yardımcı oldu!

+0

Benim için çalışıyor, ama neden? – Allan

4

Diğerleri neden çalışmadığını belirtmişlerdir.

@implementation NSManagedObject(MyPrivateAdditions) 

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

@end 

şimdi yapabileceğiniz:

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

Bu kabul edilen cevap olmalı –

İlgili konular