Kotlin中使用Room数据的一个小问题处理
随手记录一个播放器 APP 中其他同事操作数据库处理的问题
前置资料:
Android kotlin+协程+Room数据库的简单使用Android脚本之家
sqlite常用的命令-增删改查 - maxiongying - 博客园
背景:播放器中缓存数据库记录播放片源的播放位置,用于记录断点播放的位置
实现:
1、根据片源路径判断数据库表中是否存在
2、如果不存在,则在数据库表中新建插入
3、播放过程中定时更新表中位置
1跟2的代码逻辑如下
currentRecent = withContext(bgContext) {
recentDao.queryByName(videoUri!!.path)
}
if (currentRecent == null) {
currentRecent = Recent(id = null ,name = videoUri!!.path, position = 0)
supervisorScope {
try {
withContext(bgContext) {
if(recentDao.getCount() >= 100){
//if total over 100 , delete earliest 50
recentDao.deleteInfo(50)
}
recentDao.insert(currentRecent!!)
}
} catch (t: Throwable) {
Log.e(LOG_TAG, "recentDao.insert${t.message}")
}
}
}
3的代码如下
recentDao.updateRecent(currentRecent!!)
问题:第一次播放新建行后无法更新表中的位置,即第3步的更新是无效的
处理方法:
new Recent虽然插入了数据库表中,但是实际操作的并不是数据库表中持有的,重新获取下即可了
if (currentRecent == null) {
- currentRecent = Recent(id = null ,name = videoUri!!.path, position = 0)
+ var recent = Recent(id = null ,name = videoUri!!.path, position = 0)
supervisorScope {
try {
withContext(bgContext) {
if(recentDao.getCount() >= 100){//if total over 100 , delete earliest 50
recentDao.deleteInfo(50)
}
- recentDao.insert(currentRecent!!)
+ recentDao.insert(recent!!)
+ currentRecent = withContext(bgContext) {
+ recentDao.queryByName(videoUri!!.path)
+ }
}
} catch (t: Throwable) {
Log.e(LOG_TAG, "recentDao.insert${t.message}")
网友评论