kotlin номер списка комнатных данных всегда равен нулю - PullRequest
0 голосов
/ 16 января 2020

Я получаю список из конфигурации firebase, я вставляю их в базу данных с каркасом помещения, я хочу использовать liveata, чтобы уведомить mainacctivity о том, что данные извлекаются из firebase, и после того, как из базы данных все работает, я извлекаю простые данные, чтобы проверить, хранятся ли на них данные. базы данных, но когда я получаю список liveata, их значение всегда равно 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>

}

База данных приложений:

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


 }

Спасибо за вашу помощь

Ответы [ 2 ]

1 голос
/ 16 января 2020

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, а после этого вы можете наблюдать его.

0 голосов
/ 16 января 2020

Я изменил свой QuestionService

, чтобы он возвращал список вместо LiveData>

и в QuestionsViewModel var listQuestions: MutableLiveData> = MutableLiveData> ()

я делаю это. listQuestions.value = listQuestionsFromDatabase вместо this.listQuestions.value = listQuestionsFromDatabase.value

и после этого я вхожу в

questionsViewModel.listQuestions !!. наблюдаем (this, Observer> {if (it) ! = null) {// мы вводим никогда здесь, всегда null}})

с: он содержит все элементы из базы данных

я не знаю, почему жизненные данные из базы данных равны нулю

...