您是否需要保存ManagedObjectContext以使Nullify删除规则影响目标实体?

时间:2017-04-20 06:39:24

标签: swift core-data nsmanagedobject

我使用核心数据将chessGames和chessPlayers保存到数据库中。 - 每个chessGame与白色玩家和黑人玩家有一对一的关系(删除规则设置为无效)。 - 每个玩家与gamesAsWhite和gamesAsBlack(删除规则设置为拒绝)有很多关系。

当我删除一个国际象棋游戏时,如果玩家没有参与任何其他游戏,我也会尝试删除该游戏中涉及的玩家。如下面的代码所示。

用于删除国际象棋游戏和潜在玩家的代码:

context.perform {
                //deletes associated chessgameSnapShot
                context.delete(chessGameMO)
                CoreDataUtilities.save(context: context)
                //delete rule set to deny
                //player only deleted if it is not involved in any games
                whitePlayer.deleteIfNotInvolvedInAnyGames(inManagedObjectContext: context)
                blackPlayer.deleteIfNotInvolvedInAnyGames(inManagedObjectContext: context)
                CoreDataUtilities.save(context: context)
            }

deleteIfNotInvolvedInAnyGames的实现:

func deleteIfNotInvolvedInAnyGames(inManagedObjectContext context:NSManagedObjectContext){
        guard let gamesAsBlack =  self.gamesAsBlack as? Set<ChessGameMO>,
            let gamesAsWhite =  self.gamesAsWhite as? Set<ChessGameMO> else {return}
        let gamesInvolvedIn = gamesAsWhite.union(gamesAsBlack)
        if gamesInvolvedIn.isEmpty {
            context.delete(self)
        }
    }

只有在我删除chessGame后保存上下文时,代码才有效。如果我删除了第一个CoreDataUtilities.save(context: context),则whitePlayer(以及blackPlayer)永远不会在deleteIfNotInvolvedInAnyGames中被删除,因为与chessGameMO的关系不会被删除似乎已经无效了。

这是正常行为吗?在保存上下文之前,不应该更新NSManagedObjects(在内存中)之间的关系吗?

1 个答案:

答案 0 :(得分:1)

您最初的理解是正确的 - 验证仅在保存时发生。因此,如果您删除了游戏和播放器然后保存它应该工作假设所有更改都有效。 关系在保存之前不会更新。关系仍然存在,它只是指向一个已删除的对象(If UserNameComboBox.SelectedItem = "Criziel" Then TabControl1.SelectedTab = TabPage1 ElseIf UserNameComboBox.SelectedItem = "Amavel" Then TabControl1.SelectedTab = TabPage2 ElseIf UserNameComboBox.SelectedItem = "Edward" Then TabControl1.SelectedTab = TabPage3 End If )。因此,object.isDeleted中的代码必须过滤掉所有已删除的对象,然后查看该集是否为空。