Kotlin中使用Room数据的一个小问题处理

Kotlin中使用Room数据的一个小问题处理

随手记录一个播放器 APP 中其他同事操作数据库处理的问题

前置资料:

kotlin版Room数据库 — 基本使用

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}")

你可能感兴趣的:(Kotlin中使用Room数据的一个小问题处理)