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相同就替换的尴尬了。
最后
根据需求,制定合适的主键是很有必要的!
一时大意,可能会浪费比较长的时间。特此记录。