Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ROOM:如何返回未持久化的别名列_Android_Android Sqlite_Android Room - Fatal编程技术网

Android ROOM:如何返回未持久化的别名列

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

客观的

能够返回计算列和别名列,而无需保留它们

试过什么

使用下面的代码段,我想获得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,我会得到一个关于缺少列的错误

如果将动态列的类型更改为其本机类型,则会出现一个错误,该字段无法转换为实体

预期行为

与目标相同


那么,如何在不创建列的情况下执行上述查询呢?

我相信您的做法与您应该做的相反

考虑以下几点:

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