Android ROOM:如何返回未持久化的别名列
客观的 能够返回计算列和别名列,而无需保留它们 试过什么 使用下面的代码段,我想获得studentCount,而不必创建相应的列: 选择i.*, 选择COUNTs.id 来自学生的 其中s.instructorId=i.id 作为学生计数 来自导师一 我的POJO模型如下所示: @实体 公立班学生{ @PrimaryKeyautoGenerate=true 私人长id; 私有字符串firstName,lastName; 私人长教官; 公共长getId{return id;} 公共长getInstructorId{return instructorId;} 公共字符串getFirstName{return firstName;} 公共字符串getLastName{return lastName;} public void setIdlong id{this.id=id;} public void setInstructorIdlong id{this.instructorId=id;} public void setFirstNameString firstname{this.firstname=firstname;} public void setLastNameString lastname{this.lastname=lastname;} } 公共类嵌套类{ 公共int学生人数; } @实体 公开课教师{ @PrimaryKeyautoGenerate=true 私人长id; 私有字符串全名; @嵌入 私有NestingClass studentCount;//不持久 公共长getId{return id;} 公共字符串getFullName{return fullName;} 公共嵌套类getStudentCount{return studentCount;} public void setIdlong id{this.id=id;} public void setFullNameString fullName{this.fullName=fullName;} public void setStudentCountNestingClass sc{this.studentCount=sc;} } 当前行为 查询工作正常,但结果数据库中创建了studentCount的对应列,这与我想要的相反 另外,如果我删除@Embedded注释并使用@Ignore,我会得到一个关于缺少列的错误 如果将动态列的类型更改为其本机类型,则会出现一个错误,该字段无法转换为实体 预期行为 与目标相同Android ROOM:如何返回未持久化的别名列,android,android-sqlite,android-room,Android,Android Sqlite,Android Room,客观的 能够返回计算列和别名列,而无需保留它们 试过什么 使用下面的代码段,我想获得studentCount,而不必创建相应的列: 选择i.*, 选择COUNTs.id 来自学生的 其中s.instructorId=i.id 作为学生计数 来自导师一 我的POJO模型如下所示: @实体 公立班学生{ @PrimaryKeyautoGenerate=true 私人长id; 私有字符串firstName,lastName; 私人长教官; 公共长getId{return id;} 公共长getInst
那么,如何在不创建列的情况下执行上述查询呢?我相信您的做法与您应该做的相反 考虑以下几点: NestingClass.java是:- i、 e.已嵌入讲师。 课程是:- i、 e.学生人数不属于讲师的一部分 Dao StudentInstructorDao.java是:- 测试代码如下所示:-
mStudentInstructorDao = mDatabase.studentInstructorDao();
Instructor i1 = new Instructor();
i1.setFullNname("I1");
Instructor i2 = new Instructor();
i2.setFullNname("I2");
mStudentInstructorDao.insertInstructors(i1,i2);
Student s1 = new Student();
s1.setFirstName("S1");
s1.setLastName("LS1");
s1.setInstructorId(1);
Student s2 = new Student();
s2.setFirstName("S1");
s2.setInstructorId(1);
s2.setLastName("LS2");
mStudentInstructorDao.insertStudents(s1,s2);
NestingClass nc = new NestingClass(mStudentInstructorDao,1);
Log.d("INSTRUCTORINFO","Instructor " + nc.getInstructor().getFullNname() + " has " + nc.getStudentCount() + " Students");
运行时,在包含以下内容的日志中显示结果:-
2019-10-16 09:05:53.472 D/INSTRUCTORINFO: Instructor I1 has 2 Students
可供替代的
另一种方法是取消NestingClass,让讲师作为
相同数据的结果:-
2019-10-16 09:33:39.582 D/STUDENTCOUNT: Instructor I1 has 2 Students
您是否尝试过删除AS studentCount并直接在DAO中以int形式返回值?例如@Query…SQL高于public int getStudentCount@Sandi否,因为我希望它与其他列一起作为一个实体返回,这样在将结果传递到ViewModels时就不必再次查询数据库。
mStudentInstructorDao = mDatabase.studentInstructorDao();
Instructor i1 = new Instructor();
i1.setFullNname("I1");
Instructor i2 = new Instructor();
i2.setFullNname("I2");
mStudentInstructorDao.insertInstructors(i1,i2);
Student s1 = new Student();
s1.setFirstName("S1");
s1.setLastName("LS1");
s1.setInstructorId(1);
Student s2 = new Student();
s2.setFirstName("S1");
s2.setInstructorId(1);
s2.setLastName("LS2");
mStudentInstructorDao.insertStudents(s1,s2);
NestingClass nc = new NestingClass(mStudentInstructorDao,1);
Log.d("INSTRUCTORINFO","Instructor " + nc.getInstructor().getFullNname() + " has " + nc.getStudentCount() + " Students");
2019-10-16 09:05:53.472 D/INSTRUCTORINFO: Instructor I1 has 2 Students
@Entity
public class Instructor {
@PrimaryKey(autoGenerate = true)
private long id;
private String fullNname;
public long getId(){ return id; }
public String getFullNname() { return fullNname; }
public void setId(long id){ this.id = id; }
public void setFullNname(String fullName){ this.fullNname = fullName; }
//<<<<<<<<< ADDED >>>>>>>>
public int getStudentCount(StudentInstructorDao studentInstructorDao) {
return studentInstructorDao.getStudentCount(this.id);
}
}
Instructor i = mStudentInstructorDao.getInstructor(1);
Log.d("STUDENTCOUNT","Instructor " + i.getFullNname() + " has " + i.getStudentCount(mStudentInstructorDao) + " Students");
2019-10-16 09:33:39.582 D/STUDENTCOUNT: Instructor I1 has 2 Students