Я полагаю, что проблема может заключаться в необходимом отношении между C и D. Если график настроен так, что:
- Для каждого C требуется хотя бы один D.
- Многие экземпляры C указывают на один и тот же D.
Тогда в некоторый момент C, вероятно, обнаружит, что его обязательные отношения были аннулированы. Если он все равно попытается получить доступ к D, это вызовет EXC_BAD_ACCESS. (Если каждому E требуется один D, у вас может возникнуть та же проблема)
Для отладки я предлагаю,
- Установите отношение C -> D как необязательное и посмотрите, исчезнет ли ошибка.
- Измените каскады на нули по одному, начиная с C -> D, и посмотрите, исчезнет ли ошибка.
- Если у вас есть классы, убедитесь, что экземпляры не имеют общего объекта вне графа сущностей. Например, классы C и D имеют ссылку на одно и то же изображение, но это изображение не является частью объекта. Если внешние ссылки не сохранены должным образом, это также может вызвать аналогичный сбой.
- Переместите сохранение в сразу после вызова, чтобы удалить каждый B. Зарегистрируйте каждый B и его C перед удалением. Таким образом, вы сможете точно увидеть, где произошла ошибка сохранения, и в каком состоянии находится график, когда это происходит.
Edit01:
Хорошо, я посмотрел ваш код и обнаружил проблему.
Проблема в том, что у вас есть отношение "b" набора A к требуемому. Когда вы удаляете B, он выдает эту ошибку:
2010-02-24 16:14:02.064 CoreDataTestDeleteRule[20887:207] Unresolved error Error Domain=NSCocoaErrorDomain Code=1580 UserInfo=0x3d0b450 "Operation could not be completed. (Cocoa error 1580.)"
2010-02-24 16:14:06.340 CoreDataTestDeleteRule[20887:207] Unresolved error Error Domain=NSCocoaErrorDomain Code=1580 UserInfo=0x3d19980 "Operation could not be completed. (Cocoa error 1580.)", {
NSLocalizedDescription = "Operation could not be completed. (Cocoa error 1580.)";
NSValidationErrorKey = b;
NSValidationErrorObject = <A: 0x3b2faf0> (entity: A; id: 0x3d05330 <x-coredata://6870AF7C-E28F-4B4E-80AB-09C648651179/A/p1> ; data: {
b = (
);
name = a;
( Кстати, текстовые ошибки для числовых кодов ошибок Базовых данных можно найти в CoreDataErrors.h
. )
Это имеет смысл, потому что вы требуете от A иметь b, а затем удаляете все b. Простое установление отношения A - >> B для необязательного предотвращает ошибку и позволяет коду нормально работать.
У вашего кода также есть другие проблемы. Некоторые из автоматически сгенерированных классов оказались не правильно. Например, интерфейс для B.h выглядит так:
#import <CoreData/CoreData.h>
@class A;
@interface B : NSManagedObject
{
}
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) A * a;
@property (nonatomic, retain) NSManagedObject * c;
@end
Когда это должно выглядеть так:
#import <CoreData/CoreData.h>
@class A;
@class C;
@interface B : NSManagedObject
{
}
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) A * a;
@property (nonatomic, retain) C * c;
@end
Я не уверен, почему они не сработали правильно.
Я бы также не советовал использовать короткие имена переменных и классов. Objective-c имеет глобальное пространство имен, и использование однобуквенных символов является приглашением для конфликта имен. Вы никогда не знаете, кто еще спешил. Я рекомендую использовать старый фонетический алфавит в стиле Второй мировой войны (современный также рискует столкновениями) и тестовые классы имен: Адам, Бейкер, Чарли, Дэвид, Эдди и т. Д.
Похоже, мы оба сфокусировались на отношениях B <-> C <- >> D и пренебрегли, чтобы смотреть дальше. Это отладочная версия программистом «фиксации цели» военными. Вы застряли на одном понятии проблемы и не можете встряхнуться.