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

Posted

技术标签:

【中文标题】您是不是需要保存 ManagedObjectContext 以使 Nullify 删除规则影响目标实体?【英文标题】:Do you need to save ManagedObjectContext in order for a Nullify delete rule to affect destination entity?您是否需要保存 ManagedObjectContext 以使 Nullify 删除规则影响目标实体? 【发布时间】:2017-04-20 06:39:23 【问题描述】:

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

每当我删除一个 chessGame 时,我也会尝试删除参与该游戏的玩家,如果玩家没有参与任何其他游戏的话。如下代码所示。

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

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】:

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

【讨论】:

好的,这正是我正在寻找的答案类型!户田拉巴!因此,在您保存上下文之前,关系不会更新。很高兴知道!

以上是关于您是不是需要保存 ManagedObjectContext 以使 Nullify 删除规则影响目标实体?的主要内容,如果未能解决你的问题,请参考以下文章

为啥需要保存按钮?

为啥我用sublimetext写的代码需要先保存然后才能运行

iPhone 上是不是存在 Core Data?或者您将如何在 iPhone 上保存数据?

已保存的 IDLE 文件是不是会永久保存?

火狐浏览器。登录网站时提示是不是保存密码,我点了不再提醒,现在想保存了,不提示了怎么搞?

如何检查用户名和密码是不是已保存在钥匙串中