1. 理解增量更新背景
1.1 为什么需要 Room 本地缓存
移动端直接从远端拉取数据会面临网络延迟、流量消耗和离线不可用等问题。Room 作为 Android 官方 ORM 框架,将远端数据持久化到本地 SQLite 数据库,形成“本地缓存层”,以此实现以下目标:
- 离线可读:用户无网络时仍可浏览已缓存内容,避免白屏。
- 减少冗余请求:避免每次启动都重复拉取未变化的数据,降低带宽消耗。
- 提升响应速度:本地读取代价远低于网络请求,列表页能做到秒级展示。
一个典型的 Room 缓存实体定义如下:
@Entity(tableName = "news_cache")
data class NewsEntity(
@PrimaryKey val id: String,
val title: String,
val content: String,
val updatedAt: Long
)
通过 @PrimaryKey 标识唯一记录,updatedAt 时间戳用于后续判断数据是否过期,这正是增量更新的基础。
1.2 增量更新 vs 全量更新
全量更新:每次同步时,删除本地所有旧数据,再将远端全部数据重新写入缓存。
增量更新:仅拉取自上次同步以来发生变更的数据(新增、修改、删除),通过合并操作更新本地缓存。
两种策略在 DAO 层的典型实现对比:
@Dao
interface NewsDao {
// 全量更新:先清空再全部插入
@Transaction
suspend fun replaceAll(news: List<NewsEntity>) {
deleteAll()
insertAll(news)
}