在 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);
问题
是否可以为查询动态构建过滤?
问题
我有一个很大的清单,地址。用户可以通过在 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);