Kev*_*van 16 java sqlite android android-room android-architecture-components
我有一个类实体如下
@Entity
public class Task {
private String name;
private Integer ParentId;
private Integer userId;
@Ignore
private int noOfSubTask;
}
Run Code Online (Sandbox Code Playgroud)
在DAO类中有一个方法getTaskList()
@Dao
public interface TaskDao extends Dao<Task> {
@Query("SELECT *,(SELECT count(*) FROM Task b WHERE a._id = b.ParentId ) AS noOfSubTask FROM Task a ")
LiveData<List<Task>> getTaskList();
}
Run Code Online (Sandbox Code Playgroud)
我想用noOfSubTask填充由(SELECT count(*)FROM Task b WHERE a._id = b.ParentId)部分查询给出的数字,但问题是它不是一列,所以房间库不会映射它getTaskList方法in dao实现(自动生成)类.
有没有办法用dao类房间库的任何方法来填充实体的非列字段(比如我的情况下的noOfSubTask)?
几天前我遇到了同样的问题,并查看了这个线程。我正在使用Kotlin data类来创建数据库实体。鉴于Kotlin数据类不能很好地与继承子类配合使用,因此不是一个可行的选择。我的解决方案是@Embedded在包装类中使用关键字,如下所示:
data class TaskToDisplay(@Embedded
var task: Task,
var noOfSubTask: Int = 0)
Run Code Online (Sandbox Code Playgroud)
此解决方案不会在数据库中创建其他列,最重要的是,将所有“任务”字段与“房间”的响应列匹配。
创建任务的子类假设
public class TaskDisplayModel extends Task{
@Ignore
private transient int noOfSubTask;
}
Run Code Online (Sandbox Code Playgroud)
那么你的查询将是
@Query("SELECT *,(SELECT count(*) FROM Task b WHERE a._id = b.ParentId ) AS noOfSubTask FROM Task a ")
LiveData<List<TaskDisplayModel >> getTaskList();
Run Code Online (Sandbox Code Playgroud)