【问题标题】:How do you insert / delete all tables from one to many relationship in kotlin with room?您如何在 kotlin 与房间的一对多关系中插入/删除所有表?
【发布时间】:2021-05-05 14:23:06
【问题描述】:

我有以下实体:

@Entity(tableName = "match_frames_table")
data class DbFrame(
    @PrimaryKey(autoGenerate = false)
    val frameId: Int
)

在一个数据类下面,引用了其他 3 个实体,包括一个嵌套实体,DbBreakWithPots

data class DbFrameWithScoreAndBreakWithPotsAndBallStack(
    @Embedded val frame: DbFrame,
    @Relation(
        parentColumn = "frameId",
        entityColumn = "frameId",
    )
    val frameScore: List<DbScore>,
    @Relation(
        parentColumn = "frameId",
        entityColumn = "frameId",
        entity = DbBreak::class
    )
    val frameStack: List<DbBreakWithPots>,
    @Relation(
        parentColumn = "frameId",
        entityColumn = "frameId"
    )
    val ballStack: List<DbBall>
)

其中DbBreakWithPots如下:

data class DbBreakWithPots(
    @Embedded val matchBreak: DbBreak,
    @Relation(
        parentColumn = "breakId",
        entityColumn = "breakId"
    )
    val matchPots: List<DbPot>
)

在我的 DAO 中,我实现了查询方法,效果很好:

@Query("SELECT * FROM match_frames_table")
fun getMatchFrames(): LiveData<List<DbFrameWithScoreAndBreakWithPotsAndBallStack>>

但是,目前我正在逐个表手动地从数据库中插入和删除,但是我有嵌套关系的事实使它变得棘手。有没有办法简单地插入DbFrame 并通过一个 sql 请求将其删除?

【问题讨论】:

    标签: android sql android-studio kotlin android-room


    【解决方案1】:

    onUpdateonDelete 操作的 CASCADE 选项完成工作。

    更特别地在子实体中定义外键,例如:-

    @Entity(
        foreignKeys = [
            ForeignKey(entity = DBIdTotal::class, // Parent Entity
                parentColumns = ["id_DBIdTotal"], // column(s) in the parent
                childColumns = ["ref_DBIdTotal"], // column(s) in this table (the child)
                onDelete = ForeignKey.CASCADE, //<<<<<<<<<< if parent is deleted, the deletion is cascaded to the respective children and they are updated
                onUpdate = ForeignKey.CASCADE //<<<<<<<<<< if parent's referenced column(s) is updated then the updated value is changed in the respective children
            )
        ]
    )
    data class DBIdOpPedido(
        @PrimaryKey
        val id_DBIdOpPedido: Long,
        val ref_DBIdTotal: Long,
        val op: String
    )
    

    您不必对这两个操作都进行编码,您可能希望只使用 onDelete。 你不妨看看:-

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      • 2020-03-18
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      相关资源
      最近更新 更多