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

标签 swift core-data nsmanagedobject

我正在使用核心数据将 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(在内存中)之间的关系吗?

最佳答案

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

关于swift - 您是否需要保存 ManagedObjectContext 以使 Nullify 删除规则影响目标实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43512008/

相关文章:

ios - 从数组中选择 UIlabel 背景颜色,然后将其从数组中删除。 ( swift )

ios - Swift 2 逻辑 AND(&) 运算符

ios - 如何将后退图标添加到左侧栏按钮?

ios - 核心数据 - 遍历 NSManagedObject 的属性

iOS UIDevice swift

iOS应用程序: incompatible pointer types

ios - 根据属性值搜索匹配增删CoreData

iphone - CoreData 无法保存上下文,表示关系为零 - 但它肯定已设置

c++ - 为什么 NSFetchRequest 的类是错误的?

ios - 创建一个纯内存 NSManagedObject 模型