В Android Room, как я могу создать и вызвать собственный запрос

Я создал базу данных комнат с 3 столбцами (название, описание, жанр). Я хочу запросить столбец жанра с указанным пользователем жанром (комедия, ужасы и т. д.) и вернуть результаты.

ДАО-интерфейс

Я хочу, чтобы запрос извлекал только те записи, жанр которых соответствует жанру, выбранному пользователем.

@Dao
public interface MovieDAO {
    @Query SELECT * FROM movie_table WHERE genre")
    pubic LiveData<List<Movie>> getAllMovies();
}

Класс репозитория

Могу ли я в классе Repository.class передать строку жанра, выбранную пользователем, в запрос таким образом?

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);
    }
}

Класс ViewModel

Я не уверен, что что-то упустил в методе 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);
    }**
}

Деятельность

Это та часть, с которой я действительно борюсь, как активность вызывает ViewModel и передает параметр строки жанра? Я пробовал описанный ниже подход, но наблюдать возвращает следующую ошибку.

Не удается разрешить метод «наблюдать (com.example.roomexample.MainActivity, анонимный android.arch.lifecycle.Observer>)»

Если я удалю строку жанра из наблюдать, я получу следующую ошибку.

findMovieByGenre(String)в MovieViewModel не может быть применено к ()


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());                
        }
    });
}

Короче говоря, я хочу сопоставить жанр, выбранный пользователем, и сопоставить его с записью жанра в базе данных, и вернуть соответствующие результаты.

Мой код основан на следующих учебниках. Если у вас есть какие-либо дополнительные материалы, которые помогут мне в моих поисках, пожалуйста, передайте их.

Вот ссылка на мой код в его нынешнем виде. https://github.com/Шон-Никол/RoomExample

не могли бы вы дать более подробную информацию о вашем вопросе или привести пример

Android Team 03.04.2019 08:24

Я включил ссылку на GitHub, если вы хотите подробно увидеть весь код, который у меня есть.

Shawn 04.04.2019 03:10
6
2
3 686
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Чтобы получить доступ к данным вашего приложения с помощью библиотеки сохраняемости комнаты, вы работаете с объектами доступа к данным или DAO. Возможно, вам придется использовать DAO в комнате Android.

Получая доступ к базе данных с помощью класса DAO вместо построителей запросов или прямых запросов, вы можете разделить различные компоненты архитектуры вашей базы данных.

@Dao
public interface MyDao {
    @Query("SELECT * FROM movie_table ORDER BY genre")
    public ListMovies[] findMovieByGenre(String Genre);

}
Ответ принят как подходящий

Если вы используете архитектуру MVVM с LiveData, следуйте этому методу.

1. Наблюдайте за списком LiveData в КиноАктивность.java

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. В ФильмыДао

@Query("SELECT * FROM movie_table ORDER BY genre")
public LiveData<List<Movies> findMovieByGenre(String genre);

Таким образом, вы можете наблюдать за результатом запроса в методе наблюдения вашего класса Activity.

Deepak Raj, я думаю, что ваш пример дает мне потенциальный стартовый блок, но он не передает параметр Genre из MovieActivity.

Shawn 04.04.2019 03:01

@Shawn Я отредактировал ответ с параметром жанр. Проверь сейчас. Просто используйте этот код только в качестве ссылки. Это не совсем то же самое, что и ваш код. Поймите логику.

deepak raj 04.04.2019 11:11

@deepakraj, похоже, вы не используете параметр жанра в запросе. Вам понадобится запрос "SELECT * FROM movie_table WHERE жанр = :genre"

JJ Du Plessis 22.05.2020 11:11

Другие вопросы по теме