房间数据库 - 检查数据是否已经存在错误

时间:2021-03-29 12:56:03

标签: android kotlin android-room android-contentprovider

我想在活动 onCreate() 中检查数据库中是否已经存在用户数据,代码如下:

class DetailActivity: AppCompatActivity() {

      private lateinit var favoriteUserRepository : FavoriteUserRepository

      override fun onCreate(savedInstanceState: Bundle?) {

          favoriteUserRepository = FavoriteUserRepository.get()

          GlobalScope.launch {
                val dispatcher = this.coroutineContext
                CoroutineScope(dispatcher).launch {
                    if (favoriteUserRepository.checkFavoriteUser(username)) {
                        // function to show "remove from favorite database" button
                    }
                }
            }

       }
}

FavoriteUserRepository 类:

    private var INSTANCE: FavoriteUserRepository? = null

    fun initialize(context: Context) {
            if (INSTANCE == null) {
                INSTANCE = FavoriteUserRepository(context)
            }
        }

        fun get(): FavoriteUserRepository {
            return INSTANCE
                ?: throw IllegalStateException("FavoriteUserRepository must be initialized")
        }

    //check favorite function
    fun checkFavoriteUser(username: String) = favoriteUserDao.checkFavoriteUser(username)

FavoriteUserDao 中的 checkFavoriteUser 函数:

@Query("SELECT EXISTS(SELECT * FROM user WHERE id=(:username))")
fun checkFavoriteUser(username: String): Boolean

我已经在内容提供程序中初始化了 INSTANCE,但出现此错误:

E/AndroidRuntime: FATAL EXCEPTION: DefaultDispatcher-worker-1
    Process: com.android.githubmates, PID: 19416
    kotlin.UninitializedPropertyAccessException: lateinit property user has not been initialized

我该如何解决这个问题?谢谢你

2 个答案:

答案 0 :(得分:0)

在onCreate() 方法内部首先调用FavoriteUserRepository.initialize(this),如果FavoriteUserRepository 为NULL,则将创建新实例,否则没关系。 调用初始化方法后调用favoriteUserRepository = FavoriteUserRepository.get()。可以直接调用

            CoroutineScope(IO).launch {
            if (favoriteUserRepository.checkFavoriteUser(username)) {
                // function to show "remove from favorite database" button
            }
        }

代替嵌套协程块。

答案 1 :(得分:0)

这就是我们需要 DI 的原因。 Dagger2/Hilt/Koin 等 并且异常 msg 很清楚,lateinit

你的代码是异步执行的,你怎么能确定当你检查FavoriteUser时,属性favoriteUserRepository被初始化了?

而你的下一个逻辑可能仍然不对

 if (favoriteUserRepository.checkFavoriteUser(username)) {
                        // function to show "remove from favorite database" button
                    }

即使“从收藏夹数据库中删除”按钮显示正确,您还是单击了该按钮,删除了该用户。然后当再次插入该用户时,“从收藏夹数据库中删除”按钮将永远不会再次显示,除非退出并输入。