Apple belgelerinde, ters bir ilişki olmadan sorun yaşayabileceğiniz bir durum öneren harika bir örnek vardır. Bunu bu davaya eşleştirelim.
Aşağıdaki şekilde modellediğinizi varsayalım:
İle arasında " type " adlı bire bir ilişkiniz olduğunu unutmayın . İlişkiSocialApp
SocialAppType
isteğe bağlı değildir ve bir "reddet" silme kuralına sahiptir .
Şimdi aşağıdakileri göz önünde bulundurun:
SocialApp *socialApp;
SocialAppType *appType;
// assume entity instances correctly instantiated
[socialApp setSocialAppType:appType];
[managedObjectContext deleteObject:appType];
BOOL saved = [managedObjectContext save:&error];
Beklediğimiz şey, ilişki isteğe bağlı olmadığında delete kuralını Reddet olarak ayarladığımız için bu bağlamı kaydetmemek.
Ama burada tasarruf başarılı.
Nedeni ters bir ilişki kurmamamız . Bu nedenle, appType silindiğinde socialApp örneği değiştirildi olarak işaretlenmez. Dolayısıyla, kaydetmeden önce socialApp için hiçbir doğrulama gerçekleşmez (herhangi bir değişiklik olmadığı için hiçbir doğrulama gerekmediğini varsayar). Ama aslında bir değişiklik oldu. Ama yansıtılmıyor.
Uygulamayı hatırlarsak
SocialAppType *appType = [socialApp socialAppType];
appType sıfırdır.
Tuhaf, değil mi? İsteğe bağlı olmayan bir özellik için nil alıyoruz?
Ters ilişkiyi kurmuş olursanız sorun yaşamazsınız. Aksi takdirde, kodu aşağıdaki gibi yazarak kuvvet doğrulaması yapmanız gerekir.
SocialApp *socialApp;
SocialAppType *appType;
// assume entity instances correctly instantiated
[socialApp setSocialAppType:appType];
[managedObjectContext deleteObject:appType];
[socialApp setValue:nil forKey:@"socialAppType"]
BOOL saved = [managedObjectContext save:&error];