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

Realm Swift中如何更新User对象List<Book>内EmbeddedObject的名称?

更新Realm Swift中List内嵌对象的属性

由于Book是EmbeddedObject,它无法脱离父对象User单独操作,所有修改必须在Realm的写事务中,通过关联的User对象找到目标Book后进行。以下是具体实现方法:

核心实现代码

// 获取Realm实例
let realm = try! Realm()

// 替换为你要操作的用户的实际ObjectId
let targetUserId = ObjectId("你的用户ObjectId")

// 开启写事务执行修改
try! realm.write {
    // 通过主键找到目标User对象
    guard let targetUser = realm.object(ofType: User.self, forPrimaryKey: targetUserId) else {
        // 未找到用户的处理逻辑
        return
    }
    
    // 方式1:通过属性匹配查找目标Book(例如修改edition为"1st"的书籍名称)
    for book in targetUser.books {
        if book.edition == "1st" {
            book.name = "新的书籍名称"
            break // 找到目标后跳出循环,避免多余遍历
        }
    }
    
    // 方式2:通过索引直接定位(例如修改列表中第0本)
    // if targetUser.books.indices.contains(0) {
    //     targetUser.books[0].name = "新的书籍名称"
    // }
}

关键注意事项

  • 必须在写事务内操作:Realm要求所有对象属性修改都要在realm.write闭包中执行,否则会抛出异常。
  • EmbeddedObject依赖父对象:不能单独查询或修改Book对象,必须通过其所属的User对象的List来访问。
  • 优化查找效率:如果需要频繁通过某个属性(如edition)查找Book,可以给该属性添加索引,提升遍历/查找速度:
    class Book: EmbeddedObject {
      @Persisted var name: String
      @Persisted(indexed: true) var edition: String // 添加索引
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 10:20:48