kotlin room livedata 列表值始终为空

kotlin room livedata list value is always null

我从 c​​onfig firebase 检索列表我将它们插入到带有 room 框架的数据库中,我想使用 livedata 通知 mainactivity 数据是从 firebase 获取的,然后从数据库中一切正常我检索简单数据以检查数据是否正确存储在数据库中,但当我检索实时数据列表时,它们的值始终为 nul

这是我尝试过的

主要活动:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    questionsViewModel.listQuestions!!.observe(this, Observer<List<Question>>{
        // The second call it is null  
        if(it != null) {
         // we enter never here is always null
        }
    })


    questionsViewModel.getListQuestion()
}

问题视图模型:

 class QuestionsViewModel(private val questionRepo: QuestionRepository, val c : Context) : ViewModel(),
KoinComponent {


var listQuestions : MutableLiveData<List<Question>> = MutableLiveData<List<Question>>()
var question : MutableLiveData<String> = MutableLiveData()

init {
    listQuestions.value = listOf()
}

fun getListQuestion(){

    questionRepo.getQuestion({ listQuestionsFromDatabase ->
        this.listQuestions.value  = listQuestionsFromDatabase.value

    },{_ ->


    })
}

问题库:

class QuestionRepository(private val questionService: QuestionService){

fun getQuestion(onSuccess: (listQuestions: LiveData<List<Question>>) -> Unit,
                        onError: (error: String) -> Unit) {

    questionService.getListQuestionNonAsked({ listQuestions ->
        onSuccess(listQuestions)
    },{error ->


    })
}

}

问题服务:

public fun getListQuestionNonAsked (
onSuccess: (listQuestions: LiveData<List<Question>>) -> Unit,
onError: (error: String) -> Unit) {



    remoteConfig.fetchAndActivate().addOnCompleteListener {
        if (it.isSuccessful)                {


            var listQuestion =  remoteConfig.getString("questions_sport_vf")

            val json = Json(JsonConfiguration.Stable)

            try {

                val serializer = Questions.serializer()
                val questionsRecuperer : Questions = Json.nonstrict.parse(serializer, listQuestion)

                val version = questionsRecuperer.version.toInt()
                val versionFromPref = prefHandle.versionDatabaseLocal




                if(versionFromPref < version){

                    // On insere dans la base de donnee
                    // On vide la database et on insere les nouvelle donnees



                    //val questiondao = database?.questionDao()
                    database?.questionDao()?.deleteAll()


                    database?.questionDao()?.insertList(questionsRecuperer.data)


                }
   // Just for test listdata witout livedata are retrieven 
                val z = database!!.questionDao().getDataList()
  // this is my problem the value is null
                val a = database!!.questionDao().getData()
 // this value is null
                val b = a.value
                 onSuccess(database!!.questionDao().getData())

            }catch (e : Exception){
                print(e.stackTrace)
                onError(e.stackTrace.toString())
            }

        } else {


        }
    }




}

问题道:

  @Dao
   abstract class QuestionDao : BaseDao<Question> {
   @Query("SELECT * FROM Question")
    abstract fun getData(): LiveData<List<Question>>

  @Query("DELETE  FROM Question")
  abstract fun deleteAll()


constructor()

@Query("SELECT * FROM Question")
abstract fun getDataList(): List<Question>

}

应用程序数据库:

 @Database(entities = arrayOf(Question::class), version = 1, exportSchema = false)
  abstract class AppDatabase : RoomDatabase(), KoinComponent {
  abstract fun questionDao(): QuestionDao



companion object {

    private var APPDATABASE: AppDatabase? = null

    fun getInstance(context: Context): AppDatabase? {
        if (APPDATABASE == null) {
            synchronized(AppDatabase::class) {
                APPDATABASE = Room.databaseBuilder(context.getApplicationContext(),
                    AppDatabase::class.java, "questionQuizzVraiFaux.db").allowMainThreadQueries()
                    .build()
            }
        }
        return APPDATABASE
    }
 }


 }

感谢您的帮助

kotlin room livedata list value is always null

它总是 null 因为你试图观察一个尚未实例化的 LiveData 对象。要解决此问题,请按如下方式更改行代码的顺序:

questionsViewModel.getListQuestion() //Called first
questionsViewModel.listQuestions!!.observe(this, Observer<List<Question>>{
    // The second call it is null  
    if(it != null) {
     // we enter never here is always null
    }
})

所以你首先需要获取(实例化)LiveData对象,然后你就可以观察它了。

我更改了我的问题服务

到 return 列表而不是 LiveData>

和 QuestionsViewModel var listQuestions : MutableLiveData> = MutableLiveData>()

我做 this.listQuestions.value = listQuestionsFromDatabase 而不是 this.listQuestions.value = listQuestionsFromDatabase.value

然后我进入

questionsViewModel.listQuestions!!.observe(这, 观察者>{ 如果(它!=空){ // 我们在这里输入 never 总是 null } })

with : 它包含数据库中的所有元素

我不知道为什么来自数据库的实时数据为空