是否可以在Core Data中自动删除未引用的对象?

时间:2012-02-12 12:57:24

标签: iphone ios ios4 core-data entity-relationship

我的数据模型包含两个实体:具有一对多关系的作者和书籍(一位作者可能会写几本书)。

让我们说DB中只有两本书和两位作者如下:

  • A书被分配给作者X
  • B册被分配给作者Y

假设应用以下更改:

  • 图书B被分配给新的作者Z。

结果:

  • 作者Y存在于DB中,但指向没有书。

我的问题:是否可以配置数据模型,以便当作者Y没有被任何书籍引用时,会自动删除像作者Y这样的对象?

2 个答案:

答案 0 :(得分:2)

查看“删除传播”。它可以解决这个问题。

如果这不能完全满足您的需要:您可以覆盖Book实体上的- (void)prepareForDeletion,并在此时检查在上下文中注册并具有挂起更改的任何作者(因为他们的逆将会改变)并且没有书籍:

{
    // ...
    [[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对象。如果删除了一本书,Core Data将更改相应作者对象的反向关系,从而导致该关系中的错误,从而不再是错误。代码只会对这些对象进行操作。

答案 1 :(得分:1)

您需要手动确定“孤儿”书籍。

更新作者关系后,您可以查看旧的Author书籍关系,看看它是否还有书籍。

或者,您可以使用通知来确定NSManagedObjectContext更改的时间:NSManagedObjectContextObjectsDidChangeNotification。如果您注册此通知,则可以检查Author个对象的一些更改。看一下specific notification in the docs