【问题标题】:In Android Room how can I create and call a custom query在 Android Room 中,如何创建和调用自定义查询
【发布时间】:2019-08-24 13:09:38
【问题描述】:

我已经建立了一个包含 3 列(标题、描述、类型)的房间数据库。我想用用户指定的类型(喜剧、恐怖等)查询类型列并返回结果。

DAO 接口

我希望查询只检索流派与用户选择的流派匹配的条目。

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

存储库类

在 Repository.class 中,我可以通过这种方式将用户选择的流派字符串传递给 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);
    }
}

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 并传入流派字符串参数?我尝试了以下方法,但 observe 返回以下错误。

无法解析方法'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());                
        }
    });
}

总之我想匹配用户选择的流派,并将其与数据库中的流派条目进行匹配,并返回匹配结果。

我的代码基于以下教程。如果您有任何其他材料可以帮助我完成我的任务,请传递它。

这是我当前代码的链接。 https://github.com/Shawn-Nichol/RoomExample

【问题讨论】:

  • 您能否详细说明您的问题或举个例子
  • 如果您想详细查看我拥有的所有代码,我已经包含了一个指向 GitHub 的链接。

标签: android sql mvvm viewmodel android-room


【解决方案1】:

如果您使用带有 LiveData 的 MVVM 架构,请遵循此方法。

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

3MoviesRepository.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 方法中观察查询结果。

【讨论】:

  • deepak raj,我认为您的示例为我提供了一个潜在的起点,但它没有从 MovieActivity 传递流派参数。
  • @Shawn 我已经用 genere 参数编辑了答案。现在检查。仅将此代码用作参考。这与您的代码不完全相同。理解逻辑。
  • @deepakraj,您似乎没有在查询中使用流派参数。您需要查询为“SELECT * FROM movie_table WHERE Genre = :genre”
【解决方案2】:

要使用 Room 持久性库访问应用的数据,您需要使用数据访问对象或 DAO。您可能必须在 android room 中使用 DAO。

通过使用 DAO 类而不是查询构建器或直接查询来访问数据库,您可以分离数据库架构的不同组件

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

}

【讨论】:

    猜你喜欢
    • 2019-05-01
    • 1970-01-01
    • 2014-09-06
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多