繁体   English   中英

使用房间时发生 Parcelable 错误

[英]Parcelable error occurred while using the Room

使用房间时发生 Parcelable 错误。

我正在学习Room,但我还没有太多常识。 所以我不知道为什么我使用 Parcelable。

我认为将 Room 的格式更改为一对多时出现错误。

错误信息:

error: (goalId) does not exist in com.example.goalapp.db.entity.Goal. Available columns are id,goalName

public final class TodayGoal implements android.os.Parcelable {
                                                              ^

实体相关代码:

//Goal table
@Parcelize
@Entity(tableName = "goal_table")
data class Goal(
    @PrimaryKey(autoGenerate = true)
    val id: Int,
    val goalName: String,
): Parcelable


//todayGoal table
@Parcelize
@Entity(
    tableName = "today_goal_table",
    foreignKeys = [
        ForeignKey(
            entity = Goal::class,
            parentColumns = ["goalId"],
            childColumns = ["id"],
            onDelete = ForeignKey.CASCADE
        )
    ]
)
data class TodayGoal(
    val id: Int,
    @PrimaryKey(autoGenerate = true)
    val todayGoalId: Int,
    val TodayGoalName: String,
): Parcelable


//GoalAndTodayGoal
@Parcelize
data class GoalAndTodayGoals(
    @Embedded val goal: Goal,
    @Relation(
        parentColumn = "goalId",
        entityColumn = "id"
    )
    val todayGoals: List<TodayGoal>
): Parcelable

正如错误所说, Goal class中不存在goalId 尝试将Goalid属性更改为goalId

@Parcelize
@Entity(tableName = "goal_table")
data class Goal(
    @PrimaryKey(autoGenerate = true)
    val goalId: Int,
    val goalName: String,
): Parcelable

问题

您的问题是,根据parentColumns = ["goalId"],在 ForeignKey 定义中的引用未指向父( Goal )表中存在的列。

相应的(合适的)列根据@PrimaryKey(autoGenerate = true) val id: Int,命名为id

  • 如果您使用Room告诉您的目标名称列是可用列,那么您将收到后续错误,因为目标名称列不是唯一的。

    • ForeignKey必须引用UNIQUE的父列(或列组合),因为 SQLite 必须能够确定确切的父列,而不是一个以上的父列。

潜在的修复

1.id列名称更改为goalId ,因此:-

val goalId: Int,

或者,如果您希望字段/成员名称保留为id ,则:-

@ColumnInfo(name = "goalId")
val id: Int
  • 请注意,建议将这两种解决方案之一作为更好的解决方案。

2.更改为使用parentColumns = ["id"],

  • 但是,使用id作为列,如果不是相关表中唯一名为 id 的列,可能会导致歧义(什么 id 列)。

    • 如果不在SELECT语句中使用JOIN ,则不会遇到此问题。
    • 可以通过使用JOIN以及使用确切的列名来规避以表名为前缀并由. ,但这可能会导致相当长的 SQL。

3.另一种选择是完全取消ForeignKey定义,即使它不是必需的

  • ForeignKey 不定义关系,而是创建一个强制参照完整性的规则(SQLite 术语中的约束

  • 但是,您将失去参照完整性的内置保证和参照完整性的自动维护(删除父级被CASCADE ed(即,如果删除父级,则删除子级))。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM