我正在用房间来管理我当地的字典数据库。我选择一个词,然后删除它,它应该导航回主页。但是,有时在删除单词之后,它会导致一个空指针异常,试图访问我删除的单词。当异常发生时,我可以尝试捕捉它,但是我想我缺少对这些生命周期是如何工作的基本理解,如果可能的话,我希望有一个更好的方法来实现它。我很感激这里的任何帮助。
这是我的片段中delete函数的代码:
private fun deleteItem() {
viewModel.deleteWord(word)
findNavController().navigateUp()
}不确定是否需要,但这里是我的刀,没有使用存储库。
@Dao
interface DictionaryDao {
@Query("SELECT * FROM dictionary") // can alter this to order by word for example
fun getAll(): Flow<List<DictionaryData>>
@Query("SELECT * from dictionary WHERE id=:id")
fun getContents(id: Int): Flow<DictionaryData>
@Query("SELECT word FROM dictionary")
fun getWordsList(): Flow<List<String>>
@Insert (onConflict = OnConflictStrategy.IGNORE)
suspend fun insert(word: DictionaryData)
@Update
suspend fun update(word: DictionaryData)
@Delete
suspend fun delete(word: DictionaryData)}最重要的是,这里是带有观察者的片段,它在我删除之后一直试图访问我的word对象。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val id = navigationArgs.itemId
viewModel.retrieveData(id).observe(viewLifecycleOwner) { selectedItem ->
word = selectedItem
bind(word)
}
}而selectedItem对象是导致崩溃的原因:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.app1.personalpocketdictionary, PID: 12648
java.lang.NullPointerException: selectedItem must not be null
at com.app1.personalpocketdictionary.fragments.ItemDetailFragment.onViewCreated$lambda-6(ItemDetailFragment.kt:114)最后,在viewModel中使用了两个相关的函数:
fun deleteWord(word: DictionaryData){
viewModelScope.launch {
dictionaryDao.delete(word)
Log.d("devNotes", "doa delete successful")
}
}和
fun retrieveData(id: Int) : LiveData<DictionaryData>{
return dictionaryDao.getContents(id).asLiveData()
}我想,在删除项目,甚至导航到另一个片段并完成新片段的onViewCreated函数之后,我们导航到的这个观察函数将不再被使用,但是不,它仍然在尝试获取数据。但只是有时候!当我删除,一半的时间崩溃,一半的时间,它的工作。请派人来帮忙。
如果有任何混淆之处,请原谅,我很乐意进一步澄清
发布于 2022-04-12 00:28:21
您正在观察对数据库的查询结果,在该数据库中,您使用启动片段的ID获取项的值。我猜你用“单词”来显示数据。但是,当从DB中删除对象时,观察者保持不变,然后对带有该ID的DB的查询返回null,因为该对象不再存在。所以"word“就等于空了。"word“不被宣布为”空“。当您使用navigateUp时,片段不会立即被删除,而是会转到后台,并在那里发生崩溃。我可以想出两种方法来解决这个问题:
1-你宣布单词为空
var word: Object?2-您比较观察者结果的值。
...
selectedItem?.let{
word = it
bind(word)
}
...https://stackoverflow.com/questions/71835294
复制相似问题