Ошибка компилятора комнаты Android при попытке вернуть список собственных объектов в DAO: несовместимые типы: <null>невозможно преобразовать в int - PullRequest
0 голосов
/ 06 апреля 2019

Я использую комнату для операций с базой данных. У меня есть класс TableQuestion, который содержит строку и идентификатор, и у меня есть класс TableAnswer, который содержит строку, идентификатор плюс идентификатор вопроса, на который он ссылается. 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();
}

Класс TableQuestion:

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

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

1 Ответ

0 голосов
/ 07 апреля 2019

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

@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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...