簡體   English   中英

是否可以在Core Data中自動刪除未引用的對象?

[英]Is it possible to delete unreferenced objects automatically in Core Data?

我的數據模型包含兩個實體:作者和具有一對多關系的書(一個作者可能寫幾本書)。

假設數據庫中只有兩本書和兩名作者,如下所示:

  • 圖書A已分配給作者X
  • 圖書B已分配給作者Y

假設進行了以下更改:

  • 書B被分配給新的作者Z.

結果:

  • 作者Y存在於DB中,但指向沒有書。

我的問題:是否可以配置數據模型,以便在沒有任何書引用時會自動刪除諸如Author Y之類的對象?

查看“刪除傳播”。 它可以解決這個問題。

如果這不能完全滿足您的需求,則可以:在Book實體上覆蓋- (void)prepareForDeletion ,然后檢查在上下文中注冊並有未決更改的所有Author(因為它們的相反值已更改) )並且沒有書籍:

{
    // ...
    [[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將更改相應作者對象的反向關系,從而導致該關系中的錯誤,從而不再是錯誤。 代碼只對這些對象進行操作。

您將需要手動確定“孤立的”書。

當您更新作者關系時,您可以檢查舊Author的書籍關系,看它是否還有任何書籍。

或者,您可以使用通知來確定NSManagedObjectContext何時更改: NSManagedObjectContextObjectsDidChangeNotification 如果您注冊此通知,則可以檢查Author對象的許多更改。 查看docs中的特定通知

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM