有没有办法为Room Persistence Library创建Generic DAO类

时间:2018-04-11 11:15:32

标签: java android android-room

我正在使用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

2 个答案:

答案 0 :(得分:1)

库必须以这种方式工作以防止SQL注入,是的,你是对的。

来自@Query的{​​{3}}:

  

此查询在Room经过编译时验证,以确保它可以对数据库进行编译。

因此,要让查询正确编译,您必须提供tableName,而不是作为参数,而是直接在查询中提供硬编码

答案 1 :(得分:0)

尽管不能为所有实体的所有操作创建通用DAO,但至少可以创建BaseDao来统一insertinsertAllupdate,{{ 1}},updateAlldelete操作。

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。