我开始在新项目中使用Room,并在创建数据库和一些DAO后开始解决此问题。现在gradle甚至无法编译项目。见下图:
我很确定问题是由于我对Room做的错误。我在下面附上我的数据模型的代码。
基本上,我有一个包含2个实体的数据库:RecipeEntry和IngredientEntry。我试图以你在下面看到的方式建模关系。我还使用一个名为RecipeWithIngredients的POJO来封装在RecipeDao中建模的查询中返回的数据。选择此方法的原因是Room禁止您以与其他ORM相同的方式对关系进行建模。
由于SQLite是关系数据库,因此您可以指定对象之间的关系。尽管大多数ORM库允许实体对象相互引用,但Room明确禁止此。
有关此here的更多信息。
@Entity(tableName = "recipe")
public class RecipeEntry {
@PrimaryKey
private int id;
private String name;
private String image;
private int servings;
}
@Entity(tableName = "ingredient")
public class IngredientEntry {
@PrimaryKey(autoGenerate = true)
private int id;
private int quantity;
private String measure;
private String description;
@ColumnInfo(name = "recipe_id")
private int recipeId;
}
public class RecipeWithIngredients {
@Embedded
private RecipeEntry recipe;
@Relation(parentColumn = "id", entityColumn = "recipe_id", entity = IngredientEntry.class)
private List ingredients;
public RecipeEntry getRecipe() {
return recipe;
}
public void setRecipe(RecipeEntry recipe) {
this.recipe = recipe;
}
public List getIngredients() {
return ingredients;
}
public void setIngredients(List ingredients) {
this.ingredients = ingredients;
}
}
@Dao
public interface RecipeDao {
@Query("SELECT * FROM recipe, ingredient WHERE recipe.id = :recipeId AND ingredient.recipe_id = recipe.id")
List<RecipeWithIngredients> getRecipeWithIngredients(int recipeId);
}
有关正在发生的事情的任何线索?
答案 0 :(得分:1)
在与这个问题斗争了几个小时后,我发现问题出现在RecipeWithIngredients POJO中。您需要指定要在List中返回的对象类型,否则Room会出现问题。如果房间开发者可以在这方面打印任何类型的消息,那将是很酷的。当前的错误描述不太有用。 修改后的代码如下:
public class RecipeWithIngredients {
@Embedded
private RecipeEntry recipe;
@Relation(parentColumn = "id", entityColumn = "recipe_id", entity = IngredientEntry.class)
private List<IngredientEntry> ingredients;
public RecipeEntry getRecipe() {
return recipe;
}
public void setRecipe(RecipeEntry recipe) {
this.recipe = recipe;
}
public List<IngredientEntry> getIngredients() {
return ingredients;
}
public void setIngredients(List<IngredientEntry> ingredients) {
this.ingredients = ingredients;
}
}