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

点击按钮时如何更新Realm中Book对象的category字段?

问题原因

  • 代码中创建的boook是全新的临时对象,没有被Realm托管,不是你要修改的已存在于数据库中的书籍对象,修改该对象不会同步到数据库
  • 即使你想要保存这个新对象,也没有调用realm.add(boook)写入数据库,数据库中不会存在该对象的记录
  • 列表点击行的场景下,正确逻辑是获取当前点击行对应的、已经存储在Realm中的书籍对象进行修改

解决步骤

  1. 先给控制器设置Realm查询的数据源,确保列表加载的是数据库中已有的书籍对象:
// 控制器全局属性,存储Realm查询到的所有书籍
var books: Results<Book>!

override func viewDidLoad() {
    super.viewDidLoad()
    let realm = try! Realm()
    // 查询所有已存储的Book对象作为数据源
    books = realm.objects(Book.self)
    tableView.reloadData()
}
  1. 点击cell时通过indexPath从数据源取出对应书籍对象,再修改属性即可:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    func showmethisfunction() {
        let realm = try! Realm()
        // 核心修改:从数据源取已有对象,不要新建Book()
        let targetBook = books[indexPath.row]
        
        let alert = UIAlertController(title: "要把这本书加入对应书单吗?", message: "请选择一个选项", preferredStyle: .actionSheet)

        alert.addAction(UIAlertAction(title: "已读", style: .default, handler: { (_) in
            try! realm.write {
                targetBook.category = "read"
            }
        }))

        alert.addAction(UIAlertAction(title: "想读", style: .default, handler: { (_) in
            try! realm.write {
                targetBook.category = "wanttoread"
            }
        }))

        alert.addAction(UIAlertAction(title: "在读", style: .default, handler: { (_) in
            try! realm.write {
                targetBook.category = "reading"
            }
        }))

        alert.addAction(UIAlertAction(title: "取消", style: .cancel, handler: { (_) in
            print("用户点击了取消按钮")
        }))

        self.present(alert, animated: true, completion: {
            print("弹窗加载完成")
        })
    }
    showmethisfunction()
}

如果你没有全局存储数据源,也可以在点击行时通过Book的主键查询到对应对象再修改,效果一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 22:48:03