问题所在
有没有可能在运行时构造查询?
用例
@Query("SELECT * FROM playlist " +
"WHERE playlist_title LIKE '% :playlistTitle %' " +
"GROUP BY playlist_title " +
"ORDER BY playlist_title " +
"LIMIT :limit")
List<IPlaylist> searchPlaylists(String playlistTitle, int limit);
limit
部件是可选的。也就是说,它应该能够在有或没有限制的情况下执行相同的查询。
更复杂的用例
在前一种情况下,可以进行两个具有和不具有限制部分的静态查询,并且每次都可以使用适当的一个。但有时我们可能不得不处理更复杂的情况,比如构建过滤器。
在这种情况下,与前面的示例不同,将有多个可选部件。对于图书表格,我们可能需要根据图书所属的类别、作者姓名、价格范围、出版日期等进行过滤。几乎不可能对这些部分的所有组合进行静态查询。
发布于 2017-05-31 23:04:20
在我使用房间的经验中(简短地),这是不可能的,不是因为房间的限制,而是@CommonsWare隐含的评论,是对SQLite的限制。您需要两个查询,因此在DAO中需要两个方法。
我会有类似这样的东西:
@Query("SELECT * FROM playlist " +
"WHERE playlist_title LIKE '% :playlistTitle %' " +
"GROUP BY playlist_title " +
"ORDER BY playlist_title " +
"LIMIT :limit")
List<IPlaylist> searchPlaylists(String playlistTitle, int limit);
@Query("SELECT * FROM playlist " +
"WHERE playlist_title LIKE '% :playlistTitle %' " +
"GROUP BY playlist_title " +
"ORDER BY playlist_title ")
List<IPlaylist> searchPlaylists(String playlistTitle);
然后你在别的地方做旁路:
if (limit.isPresent()) {
return playlistDao.searchPlaylists(title, limit.get());
} else {
return playlistDao.searchPlaylists(title);
}
这是目前我能想到的最好的选择。
发布于 2018-12-31 22:42:44
让它变得更简单。我将向您展示使用两个变量的where子句的示例。如下所示:
@Query("SELECT * FROM Student WHERE stdName1= :myname AND stdId1=:myid")
List<Student> fetchAllData(String myname,int myid);
stdName1和stdId1是列名
发布于 2018-03-01 17:57:47
@Anderson K& @Juanky Soriano,我同意@CommonsWare,
由于房间库存在一定的局限性,利用其支持的SQLite数据库的@query()
也可以实现对房间库的完全动态查询
String mQuery = "SELECT * FROM foobar WHERE columnName1 IN ('value_1','value_2') and columnName2 In('value_3','value_4')";
AppDatabase appDatabase = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, "database-name").build();
Cursor mCursor = AppDatabase.getAppDatabase(context).getOpenHelper().getReadableDatabase().query(myQuery);
现在,您可以将游标的行式数据转换为POJO类。
https://stackoverflow.com/questions/44287465
复制相似问题