我正在使用Room Persistence Library,我试图通过创建一个Generic DAO类来避免样板代码,就像这样
@Dao
public interface PendingTaskDao<V> {
@Query("SELECT * FROM :tableName")
Maybe<List<V>> getAllEntitiesFrom(String tableName);
}
但编译器抱怨<table or subquery> expected got : tableName
。有没有办法创建Generic DAO,或者库必须以这种方式工作才能阻止SQL injection?
答案 0 :(得分:1)
库必须以这种方式工作以防止SQL注入,是的,你是对的。
来自@Query
的{{3}}:
此查询在Room经过编译时验证,以确保它可以对数据库进行编译。
因此,要让查询正确编译,您必须提供tableName,而不是作为参数,而是直接在查询中提供硬编码
答案 1 :(得分:0)
尽管不能为所有实体的所有操作创建通用DAO,但至少可以创建BaseDao来统一insert
,insertAll
,update
,{{ 1}},updateAll
和delete
操作。
deleteAll
/**
* Created by Yousuf Sohail on 10/7/18.
*/
interface BaseDao<T> {
/**
* Insert an object or array of objects in the database.
*
* @param obj the objects to be inserted.
*/
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(vararg obj: T): LongArray
/**
* Update an object or array of objects from the database.
*
* @param obj the object to be updated
*/
@Update
fun update(vararg obj: T)
/**
* Delete an object or array of objects from the database
*
* @param obj the object to be deleted
*/
@Delete
fun delete(vararg obj: T)
}
和select
将转到特定的实体Daos。