我有一个体育得分应用程序的核心数据对象。主记录称为D_MatchData,相关实体(一对多)称为D_MatchEvents。想法是,对于一次比赛,可以记录许多不同的事件。在添加和获取数据时,这一切都很好,但是我希望能够删除D_MatchEvents中的单个记录(假设用户记录了错误的事件,并且想要“撤消”)。到目前为止,我的代码如下:
// MARK: - Delete a single match event
class func deleteMatchEvent(_ matchUUID: String) -> Bool {
let fetchRequest = NSFetchRequest<D_MatchEvents>(entityName: "D_MatchEvents")
fetchRequest.predicate = NSPredicate(format: "r_ToData.d_matchUUID == %@", matchUUID)
fetchRequest.returnsObjectsAsFaults = false
do {
var events = try gContext.fetch(fetchRequest)
events.sort { return $0.d_EventSequence < $1.d_EventSequence }
gContext.delete(events[0])
try gContext.save()
for event in events {
print(event.d_EventSequence, event.d_EventTimestamp)
}
} catch {
print(error)
return false
}
return true
}
我想到了从相关实体来的问题,使用逆关系仅获取给定匹配项的那些事件。 稍后我将优化谓词,以便仅获取我感兴趣的事件。获取工作正常(进入事件数组),对数组的排序也一样,但是当我尝试从该数组中删除一行时(在这种情况[0],但也可能是其中的任何一种),我发现删除操作会从底层SQLlite DB中删除整个匹配项-主记录和所有事件记录。 (gContext是定义我的MOC的全局变量)
我一定在这里想念什么。恐怕核心数据的变幻莫测让我感到困惑。 如何在不删除整个主数据和所有相关记录的情况下,从相关实体中仅删除一行。