在我的Android项目中,我有一个ViewModel类,该类在Movie资料库中执行搜索:
class MoviesViewModel(private val repository: TmdbRepository) : ViewModel() {
private val queryLiveData = MutableLiveData<String>()
private val moviesResult: LiveData<MovieSearchResult> = Transformations.map(queryLiveData) {
repository.search(it) // The return type of this method is MovieSearchResult
}
val movies: LiveData<PagedList<Movie>> = Transformations.switchMap(moviesResult) { it.data }
/**
* Search movies based on a query string.
*/
fun searchMovies(queryString: String) {
Log.i(AppConfiguration.TAG, "SearchMoviesViewModel.searchMovies().")
queryLiveData.postValue(queryString)
}
}
这是类别MovieSearchResult
的代码:
data class MovieSearchResult(
val data: LiveData<List<Movie>>
)
repository.search(it)
的MoviesViewModel
方法访问返回以下方法的Dao模型:
@Query("SELECT * FROM Movie WHERE title LIKE '%' || :search || '%'")
fun getMoviesByName(search: String?): LiveData<List<Movie>>
在MoviesViewModel
中,变量moviesResult
的类型为LiveData<MovieSearchResult>
,repository.search(it)
的类型为MovieSearchResult
。
因此,我们正在通过方法MovieSearchResult
将类型LiveData<MovieSearchResult>
转换为Transformations.map()
。好的。
上面的搜索使用queryLiveData
,即MutableLiveData<String>
。
所以这是我的问题:如果我需要实现不需要参数的搜索,应该如何初始化一个新的LiveData
属性?如果我需要创建一个LiveData
来访问Dao方法,如下所示...
@Query("SELECT * FROM Movie")
fun getAll(): LiveData<List<Movie>>
...我应该如何定义我的LiveData
属性?
例如:以下方法将无法编译:
private val allMoviesResult: LiveData<MovieSearchResult> = repository.getAll(it)
但这是我需要做的:输入repository.getAll(it)
并获得LiveData<MovieSearchResult>
。
我不确定它是否会工作或是否有更好的解决方案,但是也许您可以尝试这样的事情:
class MoviesViewModel(private val repository: TmdbRepository) : ViewModel() {
private val queryInput = MutableLiveData<String>()
private val moviesResult: LiveData<MovieSearchResult> = Transformations.switchMap(queryInput) { query ->
if (query == "ALL") {
repository.all()
} else {
repository.search(query)
}
}
// I am also not sure about handle a List<Movie> as a PagedList<Movie>
val movies: LiveData<PagedList<Movie>> = Transformations.switchMap(moviesResult) { it.data }
fun searchMovies(queryString: String) {
queryInput.value = queryString
}
fun getAllMovies() {
queryLiveData.value = "ALL"
}
}