kotlin房间活动数据列表值始终为空

问题描述 投票:0回答:1

我从config firebase检索列表,我将它们插入到具有会议室框架的数据库中,我想使用livedata通知mainactivity数据是从firebase提取的,从数据库一切正常后,我检索简单数据以检查数据是否存储在数据库中但是当我检索实时数据列表时,它们的值始终为nul

我尝试过的这里

MainActivity:

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

QuestionsViewModel:

 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

    },{_ ->


    })
}

QuestionRepository:

class QuestionRepository(private val questionService: QuestionService){

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

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


    })
}

}

QuestionService:

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 {


        }
    }




}

QuestionDao:

  @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>

}

AppDatabase:

 @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
    }
 }


 }

感谢您的帮助

firebase kotlin android-room android-livedata
1个回答
0
投票

kotlin房间的活动数据列表值始终为空

它始终为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对象,然后您可以对其进行观察。

© www.soinside.com 2019 - 2024. All rights reserved.