当我尝试删除播放列表中的某些组时,Swiftdata 崩溃

问题描述 投票:0回答:1

我猜我的关系出了问题,我尝试循环进入组数组并删除每个组,希望通过级联它也删除所有播放列表项。 我的模型结构如下:

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>";
}.

我应该如何删除播放列表中的群组?

arrays swift core-data relationship swiftdata
1个回答
0
投票

看起来您正在 PLGroup 和 PLModel 之间的多对一关系的两侧使用级联删除,并且由于

playlistModel
是非可选的,您将在删除其中一个组之前删除 PLModel 并产生结果
nil
中的
PLGroup.playlistModel
导致验证错误。

尝试制定此删除规则

.nothing
或完全删除参数。

@Relationship(deleteRule : .cascade, inverse: \PlaylistGroup.playlistModel)
© www.soinside.com 2019 - 2024. All rights reserved.