我使用核心数据将chessGames和chessPlayers保存到数据库中。 - 每个chessGame与白色玩家和黑人玩家有一对一的关系(删除规则设置为无效)。 - 每个玩家与gamesAsWhite和gamesAsBlack(删除规则设置为拒绝)有很多关系。
当我删除一个国际象棋游戏时,如果玩家没有参与任何其他游戏,我也会尝试删除该游戏中涉及的玩家。如下面的代码所示。
用于删除国际象棋游戏和潜在玩家的代码:
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(在内存中)之间的关系吗?
答案 0 :(得分:1)
您最初的理解是正确的 - 验证仅在保存时发生。因此,如果您删除了游戏和播放器然后保存它应该工作假设所有更改都有效。 但 关系在保存之前不会更新。关系仍然存在,它只是指向一个已删除的对象(If UserNameComboBox.SelectedItem = "Criziel" Then
TabControl1.SelectedTab = TabPage1
ElseIf UserNameComboBox.SelectedItem = "Amavel" Then
TabControl1.SelectedTab = TabPage2
ElseIf UserNameComboBox.SelectedItem = "Edward" Then
TabControl1.SelectedTab = TabPage3
End If
)。因此,object.isDeleted
中的代码必须过滤掉所有已删除的对象,然后查看该集是否为空。