sql - 尝试在 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 参数为空。那就是发生错误的地方。我必须改变什么?
解决方案
我发现了问题:
@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")
推荐阅读
- xml - SOAP 请求中状态码为 500 的内部服务器错误
- mysql - 如何检查数据库中是否存在记录..如果它存在只是增加数量(laravel)?
- if-statement - if-then-else 语句的语法错误?
- git - git sparse-checkout 的奇怪行为
- mysql - SQL:更新表中百万条记录的最快方法是什么(只需要更新 ID 列值)
- azure-devops - 在 Azure DevOps 中发布 Nunit 控制台测试的测试全名
- cloud - 使用层次结构获取表上的选择 - SAP Analytics Cloud 应用程序
- python - 使用二进制掩码裁剪图像时出错
- c++ - QT 3.3.8b 未将 SIGNAL 连接到新类中的 SLOT
- typescript - 根据对象的兄弟键推断对象属性的类型