You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 4中Core Data数据删除实现咨询(附收藏添加代码)

嘿,我来帮你搞定Core Data的删除功能!结合你已经写好的收藏代码,咱们可以把这个功能完善成「点击收藏添加,再次点击取消收藏删除」的逻辑,这样用户体验会更顺畅~

实现Core Data删除数据的功能(Swift 4)

1. 优化收藏按钮的点击逻辑

首先修改你现有的favButtonClicked方法,让它支持切换收藏/取消收藏的状态,触发对应的添加或删除操作:

@IBAction func favButtonClicked(_ sender: UIButton) {
    sender.isSelected.toggle() // 一键切换按钮选中状态
    if sender.isSelected {
        saveFav() // 选中状态:执行收藏存入Core Data
    } else {
        deleteFav() // 未选中状态:执行取消收藏删除数据
    }
}

2. 编写删除方法deleteFav()

接下来实现核心的删除逻辑:先从Core Data中查询到对应角色的收藏记录,再删除并保存上下文:

func deleteFav() {
    guard let targetImage = figure?.image else { return } // 确保有要匹配的图片数据
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    
    // 1. 创建查询请求,指定要查找的实体和匹配条件
    let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Favorite")
    // 这里用你存入的图片数据作为匹配条件,如果角色有唯一ID的话,用ID更稳妥
    fetchRequest.predicate = NSPredicate(format: "favFig == %@", targetImage)
    
    do {
        // 2. 执行查询获取结果
        let matchedResults = try context.fetch(fetchRequest)
        if let favRecordToDelete = matchedResults.first as? NSManagedObject {
            // 3. 删除找到的收藏记录
            context.delete(favRecordToDelete)
            // 4. 保存上下文,让删除操作生效
            try context.save()
            print("收藏记录已成功删除!")
        }
    } catch {
        print("删除失败:\(error.localizedDescription)")
        // 这里可以根据需求添加用户提示,比如弹窗告知删除失败
    }
}

3. 额外优化:页面加载时自动设置按钮状态

为了让用户打开页面时,按钮就能正确显示当前角色是否已收藏,建议在viewDidLoad里添加状态检查逻辑:

override func viewDidLoad() {
    super.viewDidLoad()
    // 页面加载时检查当前角色是否已收藏,设置按钮初始状态
    checkFavoriteStatus()
}

func checkFavoriteStatus() {
    guard let targetImage = figure?.image else { return }
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    
    let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Favorite")
    fetchRequest.predicate = NSPredicate(format: "favFig == %@", targetImage)
    fetchRequest.fetchLimit = 1 // 只需要查询一条结果,提升效率
    
    do {
        let results = try context.fetch(fetchRequest)
        // 如果查询到结果,说明已收藏,按钮设为选中状态
        favButton.isSelected = !results.isEmpty
    } catch {
        print("检查收藏状态失败:\(error.localizedDescription)")
    }
}

小提示

如果你的角色模型有唯一标识符(比如figureId),强烈建议用ID作为查询条件,比用图片数据更可靠,能避免不同角色但图片相同的误删情况,只需要把NSPredicate改成:

fetchRequest.predicate = NSPredicate(format: "figureId == %@", figureId)

记得要先在Core Data的Favorite实体里添加figureId属性哦~

内容的提问来源于stack exchange,提问作者Medicine Man

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:49:13