kotlin room livedata 列表值始终为空
kotlin room livedata list value is always null
我从 config 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 : 它包含数据库中的所有元素
我不知道为什么来自数据库的实时数据为空
我从 config 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 : 它包含数据库中的所有元素
我不知道为什么来自数据库的实时数据为空