#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")