【问题标题】:room many to many error : columns returned by the query does not have the fields房间多对多错误:查询返回的列没有字段
【发布时间】:2021-03-08 14:53:35
【问题描述】:

我有一个包含两个实体的房间数据库,并且是多对多关系 但出现查询错误

我在使用 android room 时遇到错误

错误:查询返回的列在 com.example.sporttracker.room.relations.WorkoutWithExercises 中没有字段 [nameOfWorkout,dateOfWorkout,caloriesBurntInWorkout,workoutId],即使它们被注释为非空或原始。查询返回的列:[amountExercise,caloriesBurntProExercise,exerciseName,exerciseId] 公共抽象 androidx.lifecycle.LiveData> fetchWorkoutWithExercises(long id);

我的实体:

@Entity(tableName = "exercise_table")
data class Exercise(
@NonNull
@ColumnInfo(name = "amountExercise")
var amountExercise: String,

@NonNull
@ColumnInfo(name = "caloriesBurntProExercise")
var caloriesBurntProExercise: String,

@NonNull
@ColumnInfo(name = "exerciseName")
var exerciseName: String,

@PrimaryKey(autoGenerate = true)
@NonNull
@ColumnInfo(name = "exerciseId")
var exerciseId: Long = 0L

@Entity(tableName = "workout_table")
data class Workout(
@NonNull
@ColumnInfo(name = "nameOfWorkout")
var nameOfWorkout: String,

@NonNull
@ColumnInfo(name = "dateOfWorkout")
var dateOfWorkout: String,

@NonNull
@ColumnInfo(name = "caloriesBurntInWorkout")
var caloriesBurntInWorkout: String,

@PrimaryKey(autoGenerate = true)
@NonNull
@ColumnInfo(name = "workoutId")
var workoutId: Long = 0L

我的道:

@Query("""
    SELECT *
    FROM exercise_table
    WHERE exerciseId = :id
    """)
fun fetchWorkoutWithExercises(id: Long): LiveData<List<WorkoutWithExercises>>

我的关系:

data class WorkoutWithExercises(
@Embedded val workout: Workout,
@Relation(
    parentColumn = "workoutId",
    entityColumn = "exerciseId",
    associateBy = Junction(ExerciseWorkoutCrossRef::class)
)
val exercises: List<Exercise>
)

// region: entity
@Entity(

primaryKeys = ["exerciseId", "workoutId"],
foreignKeys = [
    ForeignKey(
        entity = Exercise::class,
        parentColumns = ["exerciseId"],
        childColumns = ["exerciseId"]
    ),
    ForeignKey(
        entity = Workout::class,
        parentColumns = ["workoutId"],
        childColumns = ["workoutId"]
        )
      ]
  )
  //endregion

 // region: data class
 data class ExerciseWorkoutCrossRef(
   @ColumnInfo(name = "exerciseId")
   val exerciseId: Long,
    @ColumnInfo(name = "workoutId", index = true)
    val workoutId: Long
 )
 //endregion

【问题讨论】:

    标签: android android-room


    【解决方案1】:

    我相信您可以通过修改 WorkoutWithExercises 来定义 exercise_tableExerciseWorkoutCrossRef 表之间的关系来解决此问题。

    • 外键只定义约束(规则)而不是关系(即使隐式存在)。

    我相信将 WorkoutWithExercises 更改为如下代码会推动您前进:-

    data class WorkoutWithExercises(
        @Embedded val workout: Workout,
        @Relation(
            entity = ExerciseWorkoutCrossRef::class,
            parentColumn = "workoutId",
            entityColumn = "workoutId"
        )
        val workoutwithexercises: List<WorkoutWithExercises>,
        @Relation(
            entity = Exercise::class,
            entityColumn = "exerciseId",
            parentColumn = "workoutid",
            associateBy = (Junction(ExerciseWorkoutCrossRef::class))
        )
        val exercises: List<Exercise>
    )
    

    即第一个 @Relation 描述了 Workout 和 ExerciseWorkoutCrossRef 表之间的关系 第二个@Relation 描述了ExerciseWorkoutCrossRefexercise_table 之间的关系。

    (因此所有三个表都是相关的,而不是 2 个)

    我相信正在发生的事情是您从 exercise_table 获取行但是无法链接(通过 ExerciseWorkoutCrossRef 表)以获取适当的 workout_table 行和列,因此是编译消息。

    【讨论】:

    • @OFeigenbaum 它为我编译好了。让我看看我是否进行了其他更改。
    • @OFeigenbaum 对于 Dao,我添加了 @Transaction 并删除了 LiveData(不会做所需的工作)所以有 @Transaction @Query(""" SELECT * FROM exercise_table WHERE exerciseId = :id """) fun fetchWorkoutWithExercises(id: Long): List&lt;WorkoutWithExercises&gt;。否则代码看起来是一样的。哦,我还在List&lt;WorkoutWithExercises&gt; 之后添加了= emptyList()。再次,它编译得很好。
    • 我已经更新了我的查询:@Transaction @Query(value = "SELECT * FROM training_table WHERE trainingId = :workoutId") fun fetchWorkoutWithExercises(workoutId: Long): LiveData
    • 然后它起作用了。谢谢麦克的帮助
    • @OFeigenbaum 很好。如果您认为答案对您有所帮助,请勾选答案以表明它对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多