任务':app:compileDebugJavaWithJavac'的执行失败。 > java.util.NoSuchElementException:List为空

时间:2017-09-20 09:02:06

标签: android android-gradle android-room

我开始在新项目中使用Room,并在创建数据库和一些DAO后开始解决此问题。现在gradle甚至无法编译项目。见下图:

enter image description here

我很确定问题是由于我对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);
}

有关正在发生的事情的任何线索?

1 个答案:

答案 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;
   }
}