基础架构

Room 合理制定主键很有必要!

2018-08-08  本文已影响0人  南窗云

遇到一个问题,获取到的缓存数据总是少固定几条,百思不得解!

问题分析

经过多方分析,发现少的那几条是 id 相同的,
插入的时候选择的是 RREPLACE,
id 是主键,也就是当id相同时,对象会被替换掉

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun saveJobs(jobItems: List<JobEntity>?)

表结构如下

@Entity(tableName = "rise_job", primaryKeys = ["id"])
data class JobEntity(
        var id: String = "0",
        var itemId: String = "0",
//      根据状态是 近期 未完成,已完成,来筛选Job列表。
        var come: String = JOB_FROM_HOME,
        //      过期时间
        var finished_at: String?,
        //      完成/未完成
        var status: String?,
        //      通过/驳回
        var submit_status: String?,
        //      过期/未过期
        var date_status: String?,
        var tasks: String?
)

解决

忽然顿悟,筛选的是按照 id 和 come 两个维度来进行的,
也就是说,只有当 id 和 come 同时相同时,才应该替换。
也就是说,应该以 这两个维度为主键 来存储,

@Entity(tableName = "rise_job", primaryKeys = ["id","come"])
data class JobEntity(
        var id: String = "0",
        var itemId: String = "0",
//      根据状态是 近期 未完成,已完成,来筛选Job列表。
        var come: String = JOB_FROM_HOME,
        //      过期时间
        var finished_at: String?,
        //      完成/未完成
        var status: String?,
        //      通过/驳回
        var submit_status: String?,
        //      过期/未过期
        var date_status: String?,
        var tasks: String?
)

这样只有 id 和 come 同时相同才会被替换,不会再出现只要id相同就替换的尴尬了。

最后

根据需求,制定合适的主键是很有必要的!
一时大意,可能会浪费比较长的时间。特此记录。

上一篇下一篇

猜你喜欢

热点阅读