Room 支持@RawQuery
注释以在运行时构造查询。
第 1 步:制作 DAO 方法
@RawQuery
使用注释而不是 normal标记 DAO 方法@Query
。
@Dao
interface BooksDao{
@RawQuery
List<Book> getBooks(SupportSQLiteQuery query);
}
第 2 步:构造查询
Room 使用准备好的语句进行安全性和编译时验证。因此,在构造查询时,我们需要分别存储查询字符串和绑定参数。
在此示例中,我将变量queryString
用于查询字符串和args
绑定参数。
(请注意,我使用文本编辑器编写代码。因此可能存在拼写错误或简单的语法错误。如果您发现任何内容,请在评论中告诉我或编辑帖子。)
// Query string
String queryString = new String();
// List of bind parameters
List<Object> args = new ArrayList();
boolean containsCondition = false;
// Beginning of query string
queryString += "SELECT * FROM BOOKS";
// Optional parts are added to query string and to args upon here
if(!authorName.isEmpty()){
queryString += " WHERE";
queryString += " author_name LIKE ?%";
args.add(authorName);
containsCondition = true;
}
if(fromDate!=null){
if (containsCondition) {
queryString += " AND";
} else {
queryString += " WHERE";
containsCondition = true;
}
queryString += " publication_date AFTER ?";
args.add(fromDate.getTime());
}
if(toDate!=null){
if (containsCondition) {
queryString += " AND";
} else {
queryString += " WHERE";
containsCondition = true;
}
queryString += " publication_date BEFORE ?";
args.add(toDate.getTime());
}
// End of query string
queryString += ";";
第 3 步:执行查询
SimpleSQLiteQuery query = new SimpleSQLiteQuery(queryString, args.toArray());
List<Book> result = booksDao.getBooks(query);
笔记
- 与正常一样
Query
, RawQuery
支持返回原始游标、实体、POJO 和带有嵌入字段的 POJO
RawQuery
支持关系