我想在活动 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
我该如何解决这个问题?谢谢你
答案 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
}
即使“从收藏夹数据库中删除”按钮显示正确,您还是单击了该按钮,删除了该用户。然后当再次插入该用户时,“从收藏夹数据库中删除”按钮将永远不会再次显示,除非退出并输入。