2009-06-02 22 views
7

Bunun aptalca bir soru olması gerektiğine inanıyorum, ancak birlikte yazmayı araştırdım ve cevabı bulamıyorum. Birçok kişi, modelinizden oluşturulan bir NSManagedObject alt sınıfınızın olduğu Generation Gap modelini kullanmayı ve sonra geçici özellikler ve davranışlar eklemek için bunu alt sınıfta kullanmayı konuşur. Bunun yararı, kalıcı modelinizi değiştirirseniz, kendi kodlarınızı üzerine yazma tehlikesi olmadan, temel dosyalarınızı yeniden oluşturabilmenizdir.CoreData - NSManagedObject öğesinin alt sınıfının bir alt sınıfının nasıl oluşturulacağı (Generation Gap pattern)

NSManagedObject türetilmiş bir temel CardMO nesnesine sahibim. Daha sonra bunu kendi Kart nesnesini yapmak için alt sınıflara ayırdım.

Sorum şu ki, yönetilen bir Kart nesnesini nasıl oluşturabilirim?

Denedim:

Card* card = [NSEntityDescription insertNewObjectForEntityForName:@"CardMO" inManagedObjectContext:moc]; 

Ama bu nesne gerçekten Kart değildir ve bu nesne üzerinde bir kart yöntemini çağırmak için giderken elbette bir istisna var.

[moc insertObject:(CardMO*)card]; 

Bu bana şifreli hata "veriyor:

böyle managedObjectContext eklemeden (init sadece [süper init] çağrıları) alloc/init ile Kart oluşturma çalıştı ve ardından ettik NSManagedObject sınıf 'Kart' atanmış başlatıcı aramak başarısız" arayarak

Bunu değiştirerek denedim [NSEntityDescription insertNewObjectForEntityForName: @ ": [AIStoreManager sharedAIStoreManager] .managedObjectContext CardMO" inManagedObjectContext] yerine [süper init]. Bu durumda geri aldığım nesne yine bir CardMO'dur ve kart yöntemlerini arayamıyorum.

Ne yapmalıyım?

Ve (bonus puanları için :-) - bu engeli geçtikten sonra, diğer Kart nesnelerini XML'den oluşturmalı ve sonra bunları NSManagedObjects uygulamasına dönüştürmeliyim. Apple'ın XMLReaderSAX'ini temel alarak kod kullanıyorum - bu kodu XML'in bir parçasına veriyorum ve bir çok fazla Kart nesnesini geri veriyor. Daha sonra bu nesneleri yönetilen nesne bağlamıma ekleyebilir miyim, yoksa XMLReaderSAX'a girip bunları nasıl oluşturduğunu değiştirebilir miyim?

3.0 sürümünde bir iPhone uygulaması yazıyorum, ancak bunun 10.5 Çekirdek Veriler için aynı olduğunu varsayalım.

cevap

8

Sussed it!

Veri modelinde, varlığın sınıf adı, en çok türetilen sınıfınki olmalıdır - Benim durumumdaki kart. Ardından sorun, herhangi bir yeni dosya oluşturmadan önce adı CardMO'ya çevirmeyi hatırlamanız gerektiğidir.

Bu, kullanıcıların neden mogenerator kullanıyor olmaları gerekir.

+0

Yönetilen nesneyi ayrıştırıcıdan yapmak için, Apple türetilmiş koduna girmem ve yukarıdaki gibi görünmesi için nesne oluşturma kodunu değiştirmem gerekiyordu. İyi çalıştı. –

0

Neden NSCoding'i kullanmıyorsunuz? Daha sonra, XML veya JSON'u veya uygulamanızın dışındaki nesneyi tanımlamanın başka yollarını destekleyebilirsiniz.

İlgili konular