Android开发:内存列表筛选与DAO查询的最优方案选择
方案选择建议
绝大多数业务场景下,直接遍历ViewModel中已缓存的列表做过滤是更优的选择,核心原因如下:
- 性能开销极低:仅500条简单结构体的遍历过滤属于纳秒到微秒级的内存操作,用户完全感知不到延迟,远优于调用DAO需要触发的本地数据库IO操作(哪怕是轻量SQLite,IO开销也比内存操作高2~3个数量级,还要额外处理数据库锁、事务调度等隐性成本)
- 数据一致性更高:直接使用当前ViewModel中已缓存的列表,和同ViewModel下其他业务逻辑使用的是同一份数据源,不会出现「缓存已更新但数据库未落库」或者「数据库有新写入但缓存未同步」导致的不同业务模块数据不一致问题
- 代码实现更简洁:内存过滤仅需要1~2行代码即可完成,不需要额外处理DAO异步查询的协程调度、回调等逻辑,也不需要额外申请内存存储新拉取的重复数据
仅在以下特殊场景下推荐调用dao.getFooBasedOnA(a: String)查询
- 业务明确要求拿到数据库层面的最新数据,允许和当前ViewModel缓存的列表存在数据差
- 后续业务迭代中Foo表的数据量可能膨胀到万级以上,且筛选逻辑除了匹配a字段外还有大量复杂判断,同时你已经在数据库的a字段上建立了索引,此时索引查询的效率会反超内存遍历
内存过滤示例代码:
// cachedFooList 即你提前存在ViewModel中的全量Foo列表 val matchedFooList = cachedFooList.filter { it.a == targetValueA }
内容的提问来源于stack exchange,提问作者Ishita Garg
相关产品推荐
相关产品推荐

