在 Room 中动态构建查询

Dynamically build query in Room

问题

是否可以为查询动态构建过滤?

问题

我有一个很大的清单,地址。用户可以通过在 SearchView 中键入文本来过滤它。如果用户在文本中放置任何 space ,它将被分割,并且将分别搜索文本的两个部分。我必须动态构建 SQL,因为我不知道会有多少 space 个字符。有什么方法可以在 Room 中使用简单的 @Query 来处理这个问题,或者我必须为此使用 @RawQuery?

例如SQL

SELECT * FROM ADDRESS WHERE (CITY LIKE '%abc%' OR STREET LIKE '%abc%') AND (CITY LIKE '%abc%' OR STREET LIKE '%def%') AND (....)

你可以在数组中传递这些词

@Query("SELECT * FROM ADDRESS WHERE CITY LIKE(:keywords)") //customize your query here
List addresses(String[] keywords);

我认为你应该做的是使用 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);