簡體   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