问题是您想传递 SQL 语句的一部分,但 Room 将其视为查询参数。
如果您愿意,可以尝试使用 Kripton Persistence Library,这是一个开源库(由我编写 :)),它极大地简化了 SQLite 针对 Android 平台的管理代码并支持此类情况。
Kripton 也适用于 DAO 模式,因此概念非常相似。只是写一个适合您需求的示例:
给定一个模型类:
@BindType
public class User {
public long id;
public String name;
public String username;
public String email;
public Address address;
public String phone;
public String website;
public Company company;
}
DAO 定义:
@BindDao(User.class)
public interface UserDao {
@BindSqlInsert
void insert(User bean);
@BindSqlSelect
List<User> selectDynamic(@BindSqlDynamicWhere String where, @BindSqlDynamicWhereParams String[] args);
}
和数据源定义:
@BindDataSource(daoSet={UserDao.class}, fileName = "kripton.quickstart.db", generateAsyncTask = true)
public interface QuickStartDataSource {
}
Kripton 将在编译时生成所有需要与数据库一起使用的代码。因此,要使用 Kripton 完成任务,您必须编写类似于以下内容的代码:
BindQuickStartDataSource ds = BindQuickStartDataSource.instance();
// execute operation in a transaction
ds.execute(new BindQuickStartDataSource.SimpleTransaction() {
@Override
public boolean onExecute(BindQuickStartDaoFactory daoFactory) throws Throwable
{
UserDaoImpl dao = daoFactory.getUserDao();
String[] p={"hello"};
dao.selectDynamic("name=?",p);
return true;
}
});
在 logcat 中,执行上述代码时,您将看到生成的日志:
database OPEN READ_AND_WRITE_OPENED (connections: 1)
UserDaoImpl, selectDynamic (line 352): SELECT id, name, username, email, address, phone, website, company FROM user WHERE name=?
selectDynamic (line 357): ==> param0: 'hello'
Rows found: 0
database CLOSED (READ_AND_WRITE_OPENED) (connections: 0)
Kripton 显然也支持静态条件和许多其他功能(我在 2015 年开始开发它)。
有关 Kripton 持久性库的更多信息: