您是否需要保存 ManagedObjectContext 以使 Nullify 删除规则影响目标实体?
Do you need to save ManagedObjectContext in order for a Nullify delete rule to affect destination entity?
我正在使用核心数据将 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
中的代码必须过滤掉所有已删除的对象,然后查看集合是否为空。
我正在使用核心数据将 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
中的代码必须过滤掉所有已删除的对象,然后查看集合是否为空。