【问题标题】: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(在内存中)之间的关系不应该在我保存上下文之前更新吗?

【问题讨论】:

    标签: swift core-data nsmanagedobject


    【解决方案1】:

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

    【讨论】:

    • 好的,这正是我正在寻找的答案类型!户田拉巴!因此,在您保存上下文之前,关系不会更新。很高兴知道!
    猜你喜欢
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 2013-06-14
    • 2019-04-21
    • 2018-04-02
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多