Android空间可重复使用的通用基类DAO

有没有什么办法用Android的房间创build可重用的通用基类DAO?

public interface BaseDao<T> { @Insert void insert(T object); @Update void update(T object); @Query("SELECT * FROM #{T} WHERE id = :id") void findAll(int id); @Delete void delete(T object); } public interface FooDao extends BaseDao<FooObject> { ... } public interface BarDao extends BaseDao<BarEntity> { ... } 

我一直无法find任何方法来实现这一点,而不必声明相同的接口成员,并为每个子类编写查询。 当处理大量类似的DAO时,这变得非常单调乏味。

Solutions Collecting From Web of "Android空间可重复使用的通用基类DAO"

今天,2017年8月8日,版本1.0.0-alpha8下面的Dao工作。 我可以有其他的Dao英雄GenericDao。

 @Dao public interface GenericDao<T> { @Insert(onConflict = OnConflictStrategy.REPLACE) void insert(T... entity); @Update void update(T entity); @Delete void delete(T entity); } 

但是,GenericDao不能包含在我的数据库类中

虽然我同意你的想法,但答案是否定的。 有几个原因。

  1. 当您的@Dao fooDao extends BaseDao<Foo>类生成@Dao fooDao extends BaseDao<Foo> ,会遇到很多“找不到类Symbol T”的错误。 这是由于Room用于生成dao实现的方法。 这是一个不会支持你想要的结果的方法,不可能很快改变(在我看来,由于types擦除)。

  2. 即使解决了这个问题,Room也不支持dynamic的@Dao查询,以防止SQL注入。 这意味着您只能dynamic地将值插入到查询中,而不是列名,表名或查询命令。 在这个例子中,你不能使用#{T}因为它会违反这个原则。 从理论上讲,如果第1点详述的问题得到解决,您可以使用插入,删除和更新。

我知道你要求房间图书馆。 但是,因为我认为你可能正在寻找一个好的图书馆来轻松地pipe理SQLite,所以我build议你使用Kripton持久性库,在其function中包括DAO hiearchypipe理。

例如,我写了一个基地道界面和一个派生的小孩道来显示我的意思:

 public interface BaseDAO<E> { @BindSqlSelect(where = "id=${work.id}") List<E> selectById(@BindSqlParam("work") E bean); @BindSqlInsert public void insertThread1(E bean); @BindSqlUpdate(where = "id=${work.id}") public boolean update(@BindSqlParam("work") E bean); @BindSqlDelete(where = "id=${work.id}") public boolean delete(@BindSqlParam("work") E bean); } 

还有一个DAO孩子

 @BindDao(Person.class) public interface PersonDAO extends BaseDAO<Person> { } 

有关Kripton持久性库的更多信息: