我猜我的关系出了问题,我尝试循环进入组数组并删除每个组,希望通过级联它也删除所有播放列表项。 我的模型结构如下:
import Foundation
import SwiftData
@Model
final class PlayListModel {
var id = UUID()
var timestamp: Date
var playlistName: String
var playlistUrl : String
var lastUpdate : Date
@Relationship(deleteRule : .cascade, inverse: \PlaylistGroup.playlistModel)
var groups : [PlaylistGroup]?
init(timestamp: Date, playlistName: String, playlistUrl: String, lastUpdate: Date) {
self.timestamp = timestamp
self.playlistName = playlistName
self.playlistUrl = playlistUrl
self.lastUpdate = lastUpdate
}
}
@Model
class PlaylistGroup : Hashable, Identifiable {
var id = UUID()
var groupName : String
var playlistModel : PlayListModel
@Relationship(deleteRule : .cascade, inverse: \PlaylistItem.group)
var playlistItems : [PlaylistItem]?
init(id: UUID = UUID(), groupName: String, playlistModel: PlayListModel) {
self.id = id
self.groupName = groupName
self.playlistModel = playlistModel
}
}
@Model
class PlaylistItem : Hashable, Identifiable{
var id = UUID()
var duration: Int?
var tvgId: String?
var tvgName: String?
var tvgcountry: String?
var tvglanguage: String?
var tvgLogo: String?
var tvgchno: String?
var tvgshift: String?
var groupTitle: String
var seasonNumber: Int?
var episodeNumber: Int?
var kind: String?
var url: URL?
var lastPlay : Date
var group : PlaylistGroup?
init(id: UUID = UUID(), duration: Int? = nil, tvgId: String? = nil, tvgName: String? = nil, tvgcountry: String? = nil, tvglanguage: String? = nil, tvgLogo: String? = nil, tvgchno: String? = nil, tvgshift: String? = nil, groupTitle: String, seasonNumber: Int? = nil, episodeNumber: Int? = nil, kind: String? = nil, url: URL? = nil, lastPlay: Date) {
self.id = id
self.duration = duration
self.tvgId = tvgId
self.tvgName = tvgName
self.tvgcountry = tvgcountry
self.tvglanguage = tvglanguage
self.tvgLogo = tvgLogo
self.tvgchno = tvgchno
self.tvgshift = tvgshift
self.groupTitle = groupTitle
self.seasonNumber = seasonNumber
self.episodeNumber = episodeNumber
self.kind = kind
self.url = url
self.lastPlay = lastPlay
}
}
我使用以下函数尝试删除给定播放列表的组。
func updatePlaylist(lista: PlayListModel) async {
print("Attempting to update playlist")
do {
let playListToUpdate = try await queryPlaylist(lista)
if playListToUpdate.count > 0 {
print("Found some playlists to update ...")
if let oldPlaylist = playListToUpdate.first {
// Delete all groups in the old playlist
if let groupsToDelete = oldPlaylist.groups {
for group in groupsToDelete {
context.delete(group) /// crash here ------------------------------
}
}
// Save the context to persist changes
try context.save()
}
} else {
print("No playlists found to update")
}
} catch {
print("Failed to update playlist: \(error.localizedDescription)")
}
}
几次循环应用程序崩溃后,我在控制台中看到许多警告,如下所示:
CoreData: warning: validation recovery attempt FAILED with Error Domain=NSCocoaErrorDomain Code=1570 "%{PROPERTY}@ is a required value." UserInfo={NSValidationErrorObject=<NSManagedObject: 0x60000211a490> (entity: PlaylistGroup; id: 0x9e19f77fbd12a499 <x-coredata://DE3ADD4B-0CE8-411A-B4FB-824B06CFFAF5/PlaylistGroup/p224>; data: {
groupName = Mexico;
id = "B7D9E512-D8B3-4ED3-BF0B-FFF57E51D43B";
playlistItems = (
);
playlistModel = nil;
}), NSLocalizedDescription=%{PROPERTY}@ is a required value., NSValidationErrorKey=playlistModel, NSValidationErrorValue=null} and {
NSLocalizedDescription = "%{PROPERTY}@ is a required value.";
NSValidationErrorKey = playlistModel;
NSValidationErrorObject = "<NSManagedObject: 0x60000211a490> (entity: PlaylistGroup; id: 0x9e19f77fbd12a499 <x-coredata://DE3ADD4B-0CE8-411A-B4FB-824B06CFFAF5/PlaylistGroup/p224>; data: {\n groupName = Mexico;\n id = \"B7D9E512-D8B3-4ED3-BF0B-FFF57E51D43B\";\n playlistItems = (\n );\n playlistModel = nil;\n})";
NSValidationErrorValue = "<null>";
}.
我应该如何删除播放列表中的群组?
看起来您正在 PLGroup 和 PLModel 之间的多对一关系的两侧使用级联删除,并且由于
playlistModel
是非可选的,您将在删除其中一个组之前删除 PLModel 并产生结果nil
中的 PLGroup.playlistModel
导致验证错误。
尝试制定此删除规则
.nothing
或完全删除参数。
@Relationship(deleteRule : .cascade, inverse: \PlaylistGroup.playlistModel)