【问题标题】:Is it possible to delete unreferenced objects automatically in Core Data?是否可以在 Core Data 中自动删除未引用的对象?
【发布时间】:2012-02-12 12:57:24
【问题描述】:

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

假设 DB 中只有两本书和两个作者如下:

  • 书籍 A 已分配给作者 X
  • 书 B 已分配给作者 Y

假设应用了以下更改:

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

结果:

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

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

【问题讨论】:

  • 您的数据是否保存在某处?如果是这样,问题是如何从后台自动删除对象,或者如何释放内存?
  • 数据保存在 SQLLite 中,我希望从后台自动删除这些对象。
  • 您是否尝试将删除传播规则设置为cascade?看到这个问题:stackoverflow.com/questions/2124022/….
  • Book 对象没有被删除,它只是分配给了不同的作者。在这种情况下,将不会触发删除规则。看来我必须在分配时手动处理。

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


【解决方案1】:

查看“删除传播”。正是为了解决这个问题。

如果这不能完全满足您的要求/需要:您可以在 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 会改变通讯作者对象的反向关系,从而导致该关系出现故障,从而不再是故障。而且代码只会对这些对象进行操作。

【讨论】:

  • 感谢您的详细回复。我认为不会调用 prepareForDeletion 因为没有对象被删除。我的方案是将一本书分配给不同的作者,因此删除规则没有理由接管。
  • 哦,我错过了那部分。你可以做类似的事情。注册 NSManagedObjectContextObjectsDidChange 并在那里做同样的事情。我已经更新了回复。
  • 最后一个问题..当有几本书与同一作者时,我如何告诉 Core Data 只有在(该作者的)最后一本书被删除时才删除该作者?上面的代码也能处理这种情况吗?
  • 是的,这就是([[author books] count] == 0) 的用途。
【解决方案2】:

您需要手动确定“孤立”图书。

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

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

【讨论】:

  • 非常感谢。我猜想关系完整性只能通过删除规则自动执行。我会按照你的建议手动处理。
猜你喜欢
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
相关资源
最近更新 更多