实施基本dao时,出现错误参数的类型必须是带有@Entity或其注解/数组的类

时间:2019-12-02 13:22:22

标签: java android entity persistence dao

我正在努力使用Android中的Room创建Java中的基本DAO。 有几篇文章,但没有一篇可以解决我遇到的错误。

这是我在编译时遇到的错误:

error: Type of the parameter must be a class annotated with @Entity or a collection/array of it.

这是我的实体/模型类:

@Entity (tableName = "user")
public class User {

    @PrimaryKey
    @ColumnInfo (name = "user_id")
    private int userId;
    @ColumnInfo (name = "lastname")
    private String lastName;
    @ColumnInfo (name = "firstname")
    private String firstName;

    public User(int userId, String lastName, String firstName) {
        this.userId = userId;
        this.lastName = lastName;
        this.firstName = firstName;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
}

这是我的基本DAO:

@Dao
public abstract class BaseDao<T> {

    @Insert
    public abstract long insert(T object);      // error here

    @Insert
    public abstract long[] insertAll(List<T> object);    // error here

    @Update
    public abstract int update(T object);   // error here

    @Update
    public abstract int updateAll(List<T> object);   // error here

    @Delete
    public abstract int delete(T object);   // error here

    @Delete
    public abstract int deleteAll(List<T> object);    // error here

}

这是我的用户DAO:


@Dao
public abstract class UserDao extends BaseDao<User> {

    @Query ("select * from user")
    public abstract LiveData<List<User>> getAll();

    @Query("delete from user")
    public abstract int deleteAll();

}

我得到六个相同类型的编译错误。这就是我的基本DAO中的功能数量。当然,泛型T不是用@Entity注释的,但是如何处理这个事实呢?

我试图解决的问题:

  • 经过几天仔细阅读有关此主题的所有帖子。大多数帖子使用Kotlin,我相信它适用于Kotlin,但我使用Java。
  • 试图将基本DAO实现为接口或抽象类
  • 试图用@Dao注释/不注释基本DAO(如某些帖子所述)
  • 试图创建一个以@Entity注释的基础实体,并让我的模型类进行如下扩展:
@Entity
public class BaseEntity { ... }    // Base entity annotated with @Entity

public class User extends BaseEntity { ... }    // subclass the model class from BaseEntity

public abstract class BaseDao<T extends BaseEntity> { ...}    // type parameterize BaseDao with base type BaseEntity

public abstract class UserDao extends BaseDao<User> { ...}    // type T should now be an descendant of BaseEntity which is an @Entity 

这些都不适合我!

一些帖子告诉我们,这种方式对他们有用,但对我却不行。 我希望有人能告诉我我做错了!

1 个答案:

答案 0 :(得分:0)

最后我发现了错误!

在我的模型类中,我有一个模型,这只是一个联接查询结果的DTO。

public class SessionAndUser {

    @Embedded
    private Session session;

    @Relation(parentColumn = "user_id", entityColumn = "user_id")
    private User user;
}

DAO实现如下所示:


@Dao
public abstract class SessionAndUserDao {   //extends BaseDao<SessionAndUser> { <-- this caused the error

    @Transaction
    @Query("select * from session")
    public abstract LiveData<List<SessionandUser>> getAll();

}

由于SessionAndUser不在数据库中,因此不能使用@Entity进行注释。

错误是,我从基本DAO扩展了DAO。因此,对我来说,解决方案是只创建dao,而无需扩展基本DAO(实际上,它不需要基本DAO的功能)。

弄清楚这一点之后,我可以看到每种经过测试的实现(使用接口或抽象类,使用Java或Kotlin)都按预期工作。