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

Realm是否保证写事务内查询始终反映数据库当前内存状态?

问题与验证示例

验证代码

class Item: Object {
    @objc dynamic var id: UUID = UUID()
    
    @objc dynamic var value: Int = 0
    
    override class func primaryKey() -> String? {
        return "id"
    }
}


let realm = try! Realm()

try! realm.write {
    let query1 = realm.objects(Item.self)
    precondition(query1.isEmpty)
    let newItem = Item()
    realm.add(newItem)
    precondition(query1.contains(newItem))

    let query2 = realm.objects(Item.self).filter("value == 12")
    precondition(query2.isEmpty)
    newItem.value = 12
    precondition(query2.count == 1 && query2[0] == newItem)
}

运行上述代码后可观察到,Realm会实时更新查询结果,所有前置条件均能通过。

核心问题

该行为是否有官方保证?即,Realm是否保证:只要在创建查询的同一线程中访问查询,即使变更尚未通过结束写事务提交到磁盘,查询也始终返回符合谓词的对象的当前内存版本?

注:仅询问手动访问查询对象时的行为(例如检查其count或是否包含某对象),不涉及观察者行为——观察者需等到写事务提交后才会被调用。


回答

是的,Realm官方明确保证这种行为。

Realm的查询本质是对数据库状态的实时、惰性求值的视图,而非一次性获取的静态快照。在同一线程的写事务内,所有对Realm对象的修改(包括添加、更新、删除)都会立即反映在已创建的查询结果中。这是因为Realm的对象模型直接映射到内存中的数据结构,写事务内的变更会实时更新这些结构,而查询会直接基于当前内存状态进行求值,无需等待事务提交到磁盘。

这种设计是Realm核心特性的一部分,确保开发者在同一线程内可以依赖查询结果的实时性,无需手动刷新或重新执行查询。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:07:26