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
相关产品推荐
相关产品推荐

