【问题标题】:Dynamically build query in Room在 Room 中动态构建查询
【发布时间】:2018-11-05 12:30:33
【问题描述】:
问题
是否可以为查询动态构建过滤?
问题
我有一个很大的列表,地址。用户可以通过在 SearchView 中键入文本来过滤它。如果用户在文本中放置任何空格,它将被分割,文本的两部分将被单独搜索。我必须动态构建 SQL,因为我不知道会有多少个空格字符。有什么方法可以在 Room 中使用简单的 @Query 来处理这个问题,或者我必须为此使用 @RawQuery?
示例 SQL:
SELECT * FROM ADDRESS WHERE (CITY LIKE '%abc%' OR STREET LIKE '%abc%') AND (CITY LIKE '%abc%' OR STREET LIKE '%def%') AND (....)
【问题讨论】:
标签:
android
sql
sqlite
android-room
【解决方案1】:
我认为你应该做的是使用RawQuery。
由于您的查询很复杂并且您不确定它有多长,您可能应该在运行时构造它并执行它。
Room 在编译时检查 @Query 的有效性,所以我认为你很难以这种方式实现它。
此示例取自文档:
@Dao
interface RawDao {
@RawQuery
User getUserViaQuery(SupportSQLiteQuery query);
}
SimpleSQLiteQuery query = new SimpleSQLiteQuery("SELECT * FROM User WHERE id = ? LIMIT 1", new Object[]{userId});
User user2 = rawDao.getUserViaQuery(query);
【解决方案2】:
你可以在数组中传递这些单词
@Query("SELECT * FROM ADDRESS WHERE CITY LIKE(:keywords)") //customize your query here
List addresses(String[] keywords);