我目前正在为我的项目应用Room
+ ViewModel
+ LiveData
。
在我的应用程序中,“显然”观察到需要的数据,但不是全部。
以下代码是category
数据的示例代码。在我的情况下,类别数据不会更改,并且始终保持相同的值状态(13个类别和内容不会更改)。类别是通过CategoryItemDao
类从数据库加载的数据。
类别数据是否需要与livedata包装在一起?
还是有足够的理由使用LiveData的observerable
功能?
我已经多次阅读LiveData指南,但我不了解确切的概念。
CategoryItemDao
@Dao
interface CategoryItemDao {
@Query("SELECT * FROM CategoryItem")
fun getAllCategoryItems(): LiveData<MutableList<CategoryItem>>
}
类别存储库
class CategoryRepository(application: Application) {
private val categoryItemDao: CategoryItemDao
private val allCategories: LiveData<MutableList<CategoryItem>>
init {
val db = AppDatabase.getDatabase(application)
categoryItemDao = db.categoryItemDao()
allCategories = categoryItemDao.getAllCategoryItems()
}
fun getAllCategories() = allCategories
}
CategoryViewModel
class CategoryViewModel(application: Application) : AndroidViewModel(application) {
private val repository = CategoryRepository(application)
private val allCategories: LiveData<MutableList<CategoryItem>>
init {
allCategories = repository.getAllCategories()
}
fun getAllCategories() = allCategories
}
答案 0 :(得分:1)
这很好,但是您可以进行一些更改:
将LiveData<MutableList<CategoryItem>>
更改为LiveData<List<CategoryItem>>
。除非确实需要,否则不要使用MutableList
。就您而言,List
可以正常工作。
在您的CategoryRepository
中,而不是在init
中进行提取,而在getAllCategories()
调用期间执行此操作。因此,请像这样更改您的代码:fun getAllCategories() = categoryItemDao.getAllCategoryItems()
类似地,在CategoryViewModel
中也是如此。将您的代码更改为:fun getAllCategories() = repository.getAllCategories()
一个常见的误解是仅在数据更改时才使用LiveData
。但这不是事实。您的13个类别可能不会更改,但是在数据库中。因此,如果要在没有LiveData
的情况下完成此操作,则必须查询数据库并在主线程中填充视图,或者需要将其包装在后台线程中。但是,如果您通过LiveData
执行此操作,则会免费获得异步响应式编码方式。只要有可能,请尝试使您的视图观察LiveData
。