首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以在核心数据中自动删除未引用的对象?

是否可以在核心数据中自动删除未引用的对象?
EN

Stack Overflow用户
提问于 2012-02-12 12:57:24
回答 2查看 499关注 0票数 1

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

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

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

假设应用了以下更改:

  • 书B被分配给一个新作者Z。

结果:

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-12 16:30:14

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

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

或者,您可以使用通知来确定NSManagedObjectContext何时更改:NSManagedObjectContextObjectsDidChangeNotification。如果注册此通知,则可以检查对Author对象的许多更改。看看那个文档中的特定通知

票数 1
EN

Stack Overflow用户

发布于 2012-02-13 09:34:26

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

如果这不能完全满足您的需要/需要:您可以在books上重写- (void)prepareForDeletion,并在此时检查在上下文中注册并有挂起的更改的任何作者(因为他们的逆序已经改变),并且没有书籍:

代码语言:javascript
运行
复制
{
    // ...
    [[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对象是错误的,请注意这段代码是如何小心不碰它的。如果一本书被删除,核心数据将改变相应作者对象的逆关系,从而导致该关系中的错误,使其不再是一个错误。代码将只对这些对象进行操作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9248969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档