Java 有没有办法为Room持久性库创建泛型DAO类

Java 有没有办法为Room持久性库创建泛型DAO类,java,android,android-room,Java,Android,Android Room,我正在使用并试图通过创建一个泛型DAO类来避免样板代码,如下所示 @Dao public interface PendingTaskDao<V> { @Query("SELECT * FROM :tableName") Maybe<List<V>> getAllEntitiesFrom(String tableName); } 但是编译器抱怨预期的get:tableName。有没有办法创建泛型DAO,或者库必须以这种方式工作才能防止SQL

我正在使用并试图通过创建一个泛型DAO类来避免样板代码,如下所示

@Dao
public interface PendingTaskDao<V>  {

    @Query("SELECT * FROM :tableName")
    Maybe<List<V>> getAllEntitiesFrom(String tableName);
}
但是编译器抱怨预期的get:tableName。有没有办法创建泛型DAO,或者库必须以这种方式工作才能防止SQL注入?

库必须以这种方式工作才能防止SQL注入,是的,您是对的

从@Query的

此查询在编译时按文件室进行验证,以确保它可以针对数据库进行良好编译


因此,为了让查询正确编译,您必须提供一个表名,而不是作为参数,而是直接在查询中硬编码的。尽管您不能为所有实体的所有操作创建一个通用DAO,但至少可以创建一个BaseDao来公用insert、insertAll、update、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和selectAll将转到实体的特定DAO。

您可能可以构建自己的实现,但您需要的不是现成的支持。谢谢,很明显,我必须复制粘贴很多内容:当出现这种情况时,您必须问自己的第一个问题是,为什么我实际上需要这么多相同的查询。对于应用程序来说,将整个表数据集具体化到内存中并不是一个好的设计,您可能在某个地方犯了设计错误。事实上,您是对的,我只有两个:D,但是DAO除了类的名称之外是相同的。