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

