Можно ли автоматически удалять не связанные объекты в Базовых данных? - PullRequest
1 голос
/ 12 февраля 2012

Моя модель данных содержит две сущности: Автор и Книга с отношением один ко многим (один автор может написать несколько книг).

Допустим, в БД всего две книги и два автора:

  • Книга А назначена Автору X
  • Книга B назначена Автору Y

Предполагается, что применяются следующие изменения:

  • Книга B назначена новому автору Z.

Результат:

  • Автор Y существует в БД, но не указывает на книгу.

Мой вопрос: возможно ли настроить модель данных таким образом, чтобы такие объекты, как Автор Y, автоматически удалялись, если на них нет ссылок ни в одной книге?

Ответы [ 2 ]

2 голосов
/ 13 февраля 2012

Проверьте "удалить распространение".Он решает именно эту проблему.

Если это не делает именно то, что вам нужно / нужно: вы можете переопределить - (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возражать, если это вина.Если книга удалена, Базовые данные изменят обратные отношения соответствующих объектов автора, следовательно, ошибку в этом отношении, так что это больше не ошибка.И код будет работать только с этими объектами.

1 голос
/ 12 февраля 2012

Вам нужно будет вручную определить «осиротевшие» книги.

Когда вы обновляете отношения с Автором, вы можете проверить старые отношения Author с книгами, чтобы узнать, есть ли у них еще какие-либо книги.

В качестве альтернативы вы можете использовать уведомления, чтобы определить, когда NSManagedObjectContext изменится: NSManagedObjectContextObjectsDidChangeNotification. Если вы зарегистрируетесь для этого уведомления, вы можете проверить количество изменений в Author объектах. Посмотрите на это специальное уведомление в документах .

...