您是不是需要保存 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 上保存数据?