Ошибка компилятора Android room при попытке вернуть список собственных объектов в DAO: несовместимые типы: не могут быть преобразованы в int

#sql #database #android-room #android-architecture-components

#sql #База данных #android-room #android-архитектура-компоненты

Вопрос:

Я использую room для операций с базой данных. У меня есть класс TableQuestion, который содержит строку и идентификатор, и у меня есть класс TableAnswer, который содержит строку, идентификатор плюс идентификатор вопроса, на который он ссылается. QuizTask объединяет вопрос со всеми его ответами. Запрос getQuestionsWithAnswer должен возвращать QuizTask, который завершает вопрос со всеми его ответами. Ошибка, указанная в заголовке, возникает в автоматически сгенерированном коде room.

Соответствующая часть интерфейса:

 @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();
}
  

Class Tableвопрос:

 @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;
    }
}
  

Класс TableAnswer:

 @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;
    }
}
  

Класс QuizTask:

 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 пытаются создать, но с null для параметра id. Вот где возникает ошибка. Что я должен изменить?

Ответ №1:

Я обнаружил проблему:

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

Идентификатор не выбран, но используется позже. Вот почему room пытается создать объекты с Id = null, что невозможно. Поэтому просто измените на:

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