首页 > 解决方案 > 尝试在 DAO 中返回自己的对象列表时 Android 房间编译器错误:不兼容的类型:无法转换为 int

问题描述

我正在使用空间进行数据库操作。我有一个 TableQuestion 类,它包含一个字符串和一个 id,我有一个 TableAnswer 类,它包含一个字符串、一个 id 加上它所引用的问题的 id。QuizTask 汇集了问题及其所有答案。查询 getQuestionsWithAnswer 应该返回一个 QuizTask ,它将问题及其所有答案包装起来。标题中提到的错误发生在自动生成的房间代码中。

接口的相关部分:

@android.arch.persistence.room.Dao
public interface dbDao {
    @Transaction
    @Query("SELECT table_question.question, table_answer.answer FROM    table_question, table_answer WHERE table_question.id = table_answer.id_question")
    LiveData<List<QuizTask>> getQuestionsWithAnswers();
}

班级表问题:

@Entity(foreignKeys = @ForeignKey(entity = TableQuestionnaire.class,
        parentColumns = "id",
        childColumns = "id_questionnaire",
        onDelete = CASCADE),
        tableName = "table_question")
public class TableQuestion {
    @PrimaryKey
    public final int id;

    @NonNull
    public String question;

    @NonNull
    public int id_questionnaire;

    public String subject;

    public String category;

    public String sub_category;

    @Ignore
    public String questionnaire;

    public TableQuestion(int id, @NonNull String question, int  id_questionnaire, String subject, String category, String sub_category) {
        this.id = id;
        this.question = question;
        this.id_questionnaire = id_questionnaire;
        this.questionnaire = null;
        this.subject = subject;
        this.category = category;
        this.sub_category = sub_category;
    }

    public void setQuestionnaire(String questionnaire){
        this.questionnaire = questionnaire;
    }
}

班级表答:

@Entity(foreignKeys = @ForeignKey(entity = TableQuestion.class,
        parentColumns = "id",
        childColumns = "id_question",
        onDelete = CASCADE),
        tableName = "table_answer")
public class TableAnswer {
    @PrimaryKey
    public final int id;

    @NonNull
    public String answer;

    @NonNull
    public final int id_question;

    public boolean rightAnswer;

    public TableAnswer(int id, String answer, int id_question, boolean rightAnswer) {
        this.id = id;
        this.answer = answer;
        this.id_question = id_question;
        this.rightAnswer = rightAnswer;
    }
}

课堂测验任务:

public class QuizTask {
    @Embedded
    private TableQuestion question;

    @Relation(parentColumn = "id", entityColumn = "id_question")
    private List<TableAnswer> answers;

    public void setQuestion(TableQuestion question){ this.question = question; }

    public TableQuestion getQuestion(){
        return question;
    }

    public void setAnswers(List<TableAnswer> answers) { this.answers = answers; }

    public List<TableAnswer> getAnswers() {
        return answers;
    }
}

AndroidStudio 在编译时不会显示任何错误。当 room 自动生成 getQuestionWithAnswers 的代码时,它会显示编译器错误“不兼容的类型:无法转换为 int”。在自动生成的 dbDao_Impl.java 中有一行尝试创建 TableQuestion 对象,但 id 参数为空。那就是发生错误的地方。我必须改变什么?

标签: sqldatabaseandroid-roomandroid-architecture-components

解决方案


我发现了问题:

@Query("SELECT table_question.question, table_answer.answer FROM    table_question, table_answer WHERE table_question.id = table_answer.id_question")

没有选择但稍后使用的 id。这就是为什么 room 尝试创建 Id = null 的对象,这是不可能的。所以只需更改为:

@Query("SELECT * FROM table_question, table_answer WHERE table_question.id = table_answer.id_question")

推荐阅读