点击按钮时如何更新Realm中Book对象的category字段?
问题原因
- 代码中创建的
boook是全新的临时对象,没有被Realm托管,不是你要修改的已存在于数据库中的书籍对象,修改该对象不会同步到数据库 - 即使你想要保存这个新对象,也没有调用
realm.add(boook)写入数据库,数据库中不会存在该对象的记录 - 列表点击行的场景下,正确逻辑是获取当前点击行对应的、已经存储在Realm中的书籍对象进行修改
解决步骤
- 先给控制器设置Realm查询的数据源,确保列表加载的是数据库中已有的书籍对象:
// 控制器全局属性,存储Realm查询到的所有书籍 var books: Results<Book>! override func viewDidLoad() { super.viewDidLoad() let realm = try! Realm() // 查询所有已存储的Book对象作为数据源 books = realm.objects(Book.self) tableView.reloadData() }
- 点击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
相关产品推荐
相关产品推荐

