首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在运行时动态查询房间数据库?

如何在运行时动态查询房间数据库?
EN

Stack Overflow用户
提问于 2017-05-31 22:27:31
回答 6查看 46.8K关注 0票数 48

问题所在

有没有可能在运行时构造查询?

用例

代码语言:javascript
复制
@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部件是可选的。也就是说,它应该能够在有或没有限制的情况下执行相同的查询。

更复杂的用例

在前一种情况下,可以进行两个具有和不具有限制部分的静态查询,并且每次都可以使用适当的一个。但有时我们可能不得不处理更复杂的情况,比如构建过滤器。

在这种情况下,与前面的示例不同,将有多个可选部件。对于图书表格,我们可能需要根据图书所属的类别、作者姓名、价格范围、出版日期等进行过滤。几乎不可能对这些部分的所有组合进行静态查询。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-05-31 23:04:20

在我使用房间的经验中(简短地),这是不可能的,不是因为房间的限制,而是@CommonsWare隐含的评论,是对SQLite的限制。您需要两个查询,因此在DAO中需要两个方法。

我会有类似这样的东西:

代码语言:javascript
复制
@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);

然后你在别的地方做旁路:

代码语言:javascript
复制
if (limit.isPresent()) {
   return playlistDao.searchPlaylists(title, limit.get());
} else {
   return playlistDao.searchPlaylists(title);
}

这是目前我能想到的最好的选择。

票数 26
EN

Stack Overflow用户

发布于 2018-12-31 22:42:44

让它变得更简单。我将向您展示使用两个变量的where子句的示例。如下所示:

代码语言:javascript
复制
  @Query("SELECT * FROM Student WHERE stdName1= :myname AND stdId1=:myid")
List<Student> fetchAllData(String myname,int myid);

stdName1和stdId1是列名

票数 4
EN

Stack Overflow用户

发布于 2018-03-01 17:57:47

@Anderson K& @Juanky Soriano,我同意@CommonsWare,

由于房间库存在一定的局限性,利用其支持的SQLite数据库的@query()也可以实现对房间库的完全动态查询

代码语言:javascript
复制
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类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44287465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档