实现一个基本 dao,我得到错误参数类型必须是一个用@Entity 注释的 class 或者它的 collection/array
Implementing a base dao, I get error Type of the parameter must be a class annotated with @Entity or a collection/array of it
我正在努力使用 Android 中的 Room 在 Java 中创建基础 DAO。
那里有几个帖子,但没有一个解决了我得到的错误。
这是我在编译时得到的错误:
error: Type of the parameter must be a class annotated with @Entity or a collection/array of it.
这是我的实体/模型class:
@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.
- 试图将 Base DAO 实现为接口或抽象 class
- 尝试使用@Dao 注释/不注释基本 DAO(如某些帖子中所述)
- 尝试创建一个用 @Entity 注释的基础实体,并让我的模型 classes 像这样扩展它:
@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
None 对我有用!
一些帖子说,这种方式对他们有效,但对我却无效。
我希望有人能告诉我我做错了什么!
终于找到错误了!
在我的模型中 类 我有一个模型,它只是一个连接查询结果的 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)都按预期工作。
我正在努力使用 Android 中的 Room 在 Java 中创建基础 DAO。 那里有几个帖子,但没有一个解决了我得到的错误。
这是我在编译时得到的错误:
error: Type of the parameter must be a class annotated with @Entity or a collection/array of it.
这是我的实体/模型class:
@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.
- 试图将 Base DAO 实现为接口或抽象 class
- 尝试使用@Dao 注释/不注释基本 DAO(如某些帖子中所述)
- 尝试创建一个用 @Entity 注释的基础实体,并让我的模型 classes 像这样扩展它:
@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
None 对我有用!
一些帖子说,这种方式对他们有效,但对我却无效。 我希望有人能告诉我我做错了什么!
终于找到错误了!
在我的模型中 类 我有一个模型,它只是一个连接查询结果的 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)都按预期工作。