[英]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
。 嘗試將Goal
的id
屬性更改為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.