Evet, bu kod gayet iyi, , öğenizin sınıfının modeli MyEntityClass
olarak ayarlanmışsa.
+ (NSString *)entityName {
return NSStringFromClass(self);
}
ve böyle diyoruz:
ben varlık sınıfı varlık adını döndüren bir sınıf yöntemi vermeyi tercih
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:[MyEntityClass entityName]];
Bu şekilde, ben sınıfını değiştirmek istiyorsanız modeldeki varlık adını değiştirmeden ad, yalnızca sınıf yönteminde değişiklik yapabilirim:
Bunu neden yapmalıyım? Eh, varlığın daha iyi bir ismine karar verebilirim. Sınıf adının değiştirilmesi, var olan bir Çekirdek Verili kalıcı mağaza ile uyumluluğu bozmaz, ancak model dosyasındaki varlık adını değiştirir. Sınıf adını ve entityName
yöntemini değiştirebilir, ancak modelde model adını değiştirmeden bırakabilirim ve sonra göç konusunda endişelenmem gerekmiyor. (Hafif geçiş, yeniden adlandırılmış varlıkları destekler, dolayısıyla her iki şekilde de bir anlaşma olmaz.)
Daha ileri gidebilir ve yönetilen nesne modelinden çalışma zamanında varlık adını entityName
yöntemine bakabilirsiniz. Varsayalım Başvurunuz temsilci yönetilen nesne modelini döndüren bir mesajı var: Eğer gerçekten bunu yapmak istiyorsanız, uygulamanızda muhtemelen bir yardımcı yöntem haline dispatch_once
bloğun içeriğini çarpanlarına gerekir Açıkçası
+ (NSString *)entityName {
static NSString *name;
static dispatch_once_t once;
dispatch_once(&once, ^{
NSString *myName = NSStringFromClass(self);
NSManagedObjectModel *model = [(AppDelegate *)[UIApplication delegate] managedObjectModel];
for (NSEntityDescription *description in model.entities) {
if ([description.managedObjectClassName isEqualToString:myName]) {
name = description.name;
break;
}
}
[NSException raise:NSInvalidArgumentException
format:@"no entity found that uses %@ as its class", myName];
});
return name;
}
temsilci (veya modeli nereden alırsanız alın).
Ek arama kodunu eklemek için o ana kadar gitmek istemiyorsanız, bu onaylamayı "entityName:" için herhangi bir dahili erişimden önce ekleyebilirsiniz. 'NSAssert (context.persistentStoreCoordinator.managedObjectModel.entitiesByName [[ self entityName]]! = Nil, @"% @ adıyla var olmayan modelde bulunamadı. Sınıf adınız varlık adınızla aynı mı? ", [Self entityName ]); 'Modelinizin varlık adınız sınıfınızın adıyla eşleşmiyorsa, bu size çalışma zamanında bir hata verecektir. –
Bu durumda, her otomatik oluşturulan nesnenin kategorisine kod eklemeniz gerekir? Sadece bu işlevi eklemek için sınıflar için yeni bir dosya oluşturmaktan endişe ediyorum. –
@VitaliK NSManagedObject öğesine bir kategori ekleyebilirsiniz, ancak bunu yaparsanız, bunu 'genelAdı' olarak adlandırmayın. İsim çarpışmalarından kaçınmak için 'Vitali_entityName' gibi bir önek kullanın. –