【问题标题】:Is there a way to create Generic DAO class for Room Persistence Library有没有办法为房间持久性库创建通用 DAO 类
【发布时间】:2018-04-11 11:15:32
【问题描述】:

我正在使用Room Persistence Library,我试图通过创建一个通用 DAO 类来避免样板代码,就像这样

@Dao
public interface PendingTaskDao<V>  {

    @Query("SELECT * FROM :tableName")
    Maybe<List<V>> getAllEntitiesFrom(String tableName);
}

但是编译器抱怨&lt;table or subquery&gt; expected got : tableName。有没有办法创建通用 DAO,或者库必须以这种方式工作以防止SQL injection

【问题讨论】:

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

标签: java android android-room


【解决方案1】:

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

来自@Querydocs

Room 在编译时验证此查询,以确保它可以针对数据库正常编译。

所以要让查询正确编译,你必须提供一个tableName,不是作为参数,而是直接在查询中,硬编码

【讨论】:

    【解决方案2】:

    虽然你不能为所有实体的所有操作创建一个通用的DAO,但你至少可以创建一个BaseDao来通用insertinsertAllupdateupdateAlldelete、和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)
    }
    

    selectselectAll 会去实体的特定 Daos。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-19
      • 2017-10-29
      • 1970-01-01
      • 2018-02-12
      • 2018-05-27
      • 2018-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多