В Android Room, как я могу создать и вызвать пользовательский запрос - PullRequest
3 голосов
/ 03 апреля 2019

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

Интерфейс DAO

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

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

Activity

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

Не удается разрешить метод 'наблюдения (com.example.roomexample.MainActivity, anonymous 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/Shawn-Nichol/RoomExample

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

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

1 .Соблюдайте список LiveData в MoviesActivity.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 MoviesDao

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

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

0 голосов
/ 03 апреля 2019

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

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

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

}
...