[英]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.