Проверьте "удалить распространение".Он решает именно эту проблему.
Если это не делает именно то, что вам нужно / нужно: вы можете переопределить - (void)prepareForDeletion
в сущности Book и в этот момент проверить всех авторов, зарегистрированных вконтекст и имеют ожидающие изменения (так как их обратное будет изменено) и не имеют книг:
{
// ...
[[NSNotificationCenter defaultNotificationCenter] addObserver:self selector:@selector(deleteOrphanedAuthors:) name:NSManagedObjectContext object:moc];
// ...
}
- (void)deleteOrphanedAuthors:(NSNotification *)note;
{
NSManagedObjectContext *moc = [note object];
NSManagedObjectModel *mom = [[moc persistentStoreCoordinator] managedObjectModel];
NSEntityDescription *authorEntity = [[mom entitiesByName] objectForKey:@"Author"];
for (NSManagedObject *author in [moc updatedObjects]) {
if ([author entity] == authorEntity) {
if (![author hasFaultForRelationshipNamed:@"books"] && ([[author books] count] == 0)) {
[moc deleteObject:author];
}
}
}
}
Примечание: Вы можете не передать nil
в качествеобъект (т. е. контекст) для наблюдения, поскольку используемые вами фреймворки могут иметь собственный контекст, и вы не хотите связываться с ними.
Также обратите внимание, как этот код осторожен, чтобы не касаться author
возражать, если это вина.Если книга удалена, Базовые данные изменят обратные отношения соответствующих объектов автора, следовательно, ошибку в этом отношении, так что это больше не ошибка.И код будет работать только с этими объектами.