在 Android 房间中,我如何创建和调用自定义查询
In Android Room how can I create and call a custom query
我建立了一个包含 3 列(标题、描述、流派)的房间数据库。我想用 user-specified 流派(喜剧、恐怖等)和 return 结果查询流派列。
DAO 接口
我希望查询仅检索类型与用户选择的类型匹配的条目。
@Dao
public interface MovieDAO {
@Query SELECT * FROM movie_table WHERE genre")
pubic LiveData<List<Movie>> getAllMovies();
}
存储库Class
在Repository.class中,是否可以通过这种方式将用户选择的流派String传递给Query?
public class MovieRepository {
private MovieDao movieDao;
private LiveData<List<Movie>> allMovies;
public MovieRepository(Application application) {
MovieDatabase database = MovieDatabase.getInstance(application);
movieDao = database.MovieDao();
allMovies = movieDao.getAllMovies
}
public void findMoviesByGenre(String genre) {
movieDao.findMoviesByGenre(genre);
}
}
视图模型class
我不确定我是否遗漏了 findMovieByGenre() 方法中的某些内容
public class MovieViewModel exteneds AndroidViewModel {
private MovieRepository repository;
private LiveData<List<Movie>> allMovies
// Constructor,
public MovieViewModel(@NonNull Application application) {
super(application);
repository = new MovieRepository(Application)
allMovies = repository.getAllMovies();
}
**public void findMovieByGenre(String genre) {
repository.findMoviesByGenre(genre);
}**
}
Activity
这是我真正纠结的部分,activity 如何调用 ViewModel 并传入 genre 字符串参数?我尝试了下面的方法,但是 observe return 出现以下错误。
无法解析方法'observe(com.example.roomexample.MainActivity, anonymous android.arch.lifecycle.Observer>)'
如果我从 observe 中删除流派字符串,我会收到以下错误。
无法应用 MovieViewModel 中的 findMovieByGenre(String)
到 ()
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
movieViewModel = ViewModelProviders.of(this). get(MovieViewModel.class);
movieViewModel.findMovieByGenre("comedy").observe(this, new Observer<List<Movie>>() {
@Override
public void onChanged(@Nullable final List<Movie> movies) {
Log.d("Movie", movies.get(num).getTitle());
Log.d("Movie", movies.get(num).getDescription());
Log.d("Movie", movies.get(num).getGenre());
}
});
}
总之我想匹配用户选择的流派,匹配到数据库中的流派条目和return匹配结果。
我的代码基于以下教程。如果您有任何其他 material 代码可以帮助我完成任务,请将其传递给我们。
这是我目前的代码的 link。
https://github.com/Shawn-Nichol/RoomExample
要使用 Room 持久性库访问应用程序的数据,您需要使用数据访问对象或 DAO。您可能需要在 android 房间中使用 DAO。
通过使用 DAO class 而不是查询构建器或直接查询来访问数据库,您可以分离数据库架构的不同组件
@Dao
public interface MyDao {
@Query("SELECT * FROM movie_table ORDER BY genre")
public ListMovies[] findMovieByGenre(String Genre);
}
如果您将 MVVM 架构与 LiveData 结合使用,请遵循此方法。
1。观察MoviesActivity.java
中的LiveData列表
final LiveData<List<MoviesData>> viewModelData = moviesViewModel.getMoviesByGenre("comedy");
viewModelData.observe(this, new Observer<List<MoviesData>>() {
@Override
public void onChanged(List<MoviesData> moviesData) {
//Handle the Movies List here.
}
});
2。在MoviesViewModel.java
public LiveData<List<NotificationData>> getMoviesByGenre(String genere) {
MoviesRepository mRepository = new MoviesRepository(application);
LiveData<List<MoviesData>> mMoviesData = mRepository.getMoviesByGenre(genere);
return mMoviesData;
}
3。 MoviesRepository.java
private MoviesDao mMoviesDao;
//Initialize.
AppDatabase db = AppDatabase.getAppDatabase(application);
mMoviesDao = db.moviesDao();
public LiveData<List<MoviesData>> getMoviesByGenre(String genere) {
mMovies = mMoviesDao.findMovieByGenre(genere);
return mMovies;
}
3。在 MoviesDao
@Query("SELECT * FROM movie_table ORDER BY genre")
public LiveData<List<Movies> findMovieByGenre(String genre);
因此您可以在 Activity class' Observe 方法中观察查询结果。
我建立了一个包含 3 列(标题、描述、流派)的房间数据库。我想用 user-specified 流派(喜剧、恐怖等)和 return 结果查询流派列。
DAO 接口
我希望查询仅检索类型与用户选择的类型匹配的条目。
@Dao
public interface MovieDAO {
@Query SELECT * FROM movie_table WHERE genre")
pubic LiveData<List<Movie>> getAllMovies();
}
存储库Class
在Repository.class中,是否可以通过这种方式将用户选择的流派String传递给Query?
public class MovieRepository {
private MovieDao movieDao;
private LiveData<List<Movie>> allMovies;
public MovieRepository(Application application) {
MovieDatabase database = MovieDatabase.getInstance(application);
movieDao = database.MovieDao();
allMovies = movieDao.getAllMovies
}
public void findMoviesByGenre(String genre) {
movieDao.findMoviesByGenre(genre);
}
}
视图模型class
我不确定我是否遗漏了 findMovieByGenre() 方法中的某些内容
public class MovieViewModel exteneds AndroidViewModel {
private MovieRepository repository;
private LiveData<List<Movie>> allMovies
// Constructor,
public MovieViewModel(@NonNull Application application) {
super(application);
repository = new MovieRepository(Application)
allMovies = repository.getAllMovies();
}
**public void findMovieByGenre(String genre) {
repository.findMoviesByGenre(genre);
}**
}
Activity
这是我真正纠结的部分,activity 如何调用 ViewModel 并传入 genre 字符串参数?我尝试了下面的方法,但是 observe return 出现以下错误。
无法解析方法'observe(com.example.roomexample.MainActivity, anonymous android.arch.lifecycle.Observer>)'
如果我从 observe 中删除流派字符串,我会收到以下错误。
无法应用 MovieViewModel 中的 findMovieByGenre(String) 到 ()
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
movieViewModel = ViewModelProviders.of(this). get(MovieViewModel.class);
movieViewModel.findMovieByGenre("comedy").observe(this, new Observer<List<Movie>>() {
@Override
public void onChanged(@Nullable final List<Movie> movies) {
Log.d("Movie", movies.get(num).getTitle());
Log.d("Movie", movies.get(num).getDescription());
Log.d("Movie", movies.get(num).getGenre());
}
});
}
总之我想匹配用户选择的流派,匹配到数据库中的流派条目和return匹配结果。
我的代码基于以下教程。如果您有任何其他 material 代码可以帮助我完成任务,请将其传递给我们。
这是我目前的代码的 link。 https://github.com/Shawn-Nichol/RoomExample
要使用 Room 持久性库访问应用程序的数据,您需要使用数据访问对象或 DAO。您可能需要在 android 房间中使用 DAO。
通过使用 DAO class 而不是查询构建器或直接查询来访问数据库,您可以分离数据库架构的不同组件
@Dao
public interface MyDao {
@Query("SELECT * FROM movie_table ORDER BY genre")
public ListMovies[] findMovieByGenre(String Genre);
}
如果您将 MVVM 架构与 LiveData 结合使用,请遵循此方法。
1。观察MoviesActivity.java
中的LiveData列表final LiveData<List<MoviesData>> viewModelData = moviesViewModel.getMoviesByGenre("comedy");
viewModelData.observe(this, new Observer<List<MoviesData>>() {
@Override
public void onChanged(List<MoviesData> moviesData) {
//Handle the Movies List here.
}
});
2。在MoviesViewModel.java
public LiveData<List<NotificationData>> getMoviesByGenre(String genere) {
MoviesRepository mRepository = new MoviesRepository(application);
LiveData<List<MoviesData>> mMoviesData = mRepository.getMoviesByGenre(genere);
return mMoviesData;
}
3。 MoviesRepository.java
private MoviesDao mMoviesDao;
//Initialize.
AppDatabase db = AppDatabase.getAppDatabase(application);
mMoviesDao = db.moviesDao();
public LiveData<List<MoviesData>> getMoviesByGenre(String genere) {
mMovies = mMoviesDao.findMovieByGenre(genere);
return mMovies;
}
3。在 MoviesDao
@Query("SELECT * FROM movie_table ORDER BY genre")
public LiveData<List<Movies> findMovieByGenre(String genre);
因此您可以在 Activity class' Observe 方法中观察查询结果。