enter image description here

我正在处理一个像one-to-many数据库这样的图像.

为了解释函数的流程,每当按下Add button时,列表中就会添加WorkoutSetInfo.(It is not inserted into DB.)

最后,当按下Save button时,WorkoutWorkoutSetInfo list被插入DB.

我已经完成了设置WorkoutWorkoutSetInfo之间的关系,但我不知道如何将每个Workout中的ID与Id(parendWorkoutId)WorktoutSetInfo匹配.

(现在,parendWorkoutId的所有ID都设置为1.)

我该怎么设置呢?


Workout

@Entity
data class Workout(
    @PrimaryKey(autoGenerate = true)
    val workoutId: Long,
    val title: String = "",
    var unit: String = "kg",
    val memo: String = "",
)

WorkoutSetInfo

@Entity(
    foreignKeys = [
        ForeignKey(
            entity = Workout::class,
            parentColumns = arrayOf("workoutId"),
            childColumns = arrayOf("parentWorkoutId"),
            onDelete = ForeignKey.CASCADE
        )
    ]
)
data class WorkoutSetInfo(
    @PrimaryKey(autoGenerate = true)
    val id: Long = 0,
    val set: Int,
    var weight: String = "",
    var reps: String = "",
    val parentWorkoutId: Long = 1 // How do I set this up?
)

WorkoutWithSets

data class WorkoutWithSets(
    @Embedded val workout: Workout,
    @Relation (
        parentColumn = "workoutId" ,
        entityColumn = "parentWorkoutId"
    )
    val sets: List<WorkoutSetInfo>
)

Repository

class WorkoutRepository(private val workoutDao : WorkoutDao, title: String) {
    val workout = Workout(0, title)
    private val setInfoList = ArrayList<WorkoutSetInfo>()
    
    fun add() {
        val item = WorkoutSetInfo(set = setInfoList.size + 1)
        setInfoList.add(item)
    }

    fun delete() {
        if(setInfoList.size != 0)
            setInfoList.removeLast()
        return
    }

    fun save() {
        workoutDao.insertWorkout(workout)
        workoutDao.insertSetInfoList(setInfoList)
    }
}

推荐答案

workoutDao接口/抽象类中,让insertWorkout函数返回Long.这将是id of the inserted Workout-1 if the insert was ignored.

检索/使用此返回值,并使用它设置save函数中setInfoList中每个元素的parentWorkoutId.

  • 当然,如果该值为-1,则应适当处理,因为不会插入训练.

例如.

如果将parentWorkoutIdval更改为var,则保存功能可能类似于:-

fun save(): Boolean {
    var rv = false /* indicate nothing done as insert was ignored */
    val id = workoutDao.insertWorkout(workout)
    if (id > 0) {
        rv = true
        for (wi in setInfoList) {
            wi.parentWorkoutId = id
        }
        workoutDao.insertSetInfoList(setInfoList)
    }
    return rv
}

Android相关问答推荐

使用不同的Google帐户登录

Android编写动画在发布版本中崩溃

使用Kotlin的SD卡

我如何剪裁一个可由另一个合成的

Android事件:APP_SCOUT_HANG警告SQLite

属性可选的涟漪效果ItemBackEarth Borderless不适用于Android 13和更高版本

如何在 compose 中使用可变对象?

解决失败:Landroidx/compose/runtime/PrimitiveSnapshotStateKt

Android Studio Relay插件(版本0.3.07)错误

Andorid Studio编译器如何自动为变量editText生成mutableStateOf("")的方法名?

如何使用滑行加载媒体的专辑封面?

在一个函数中组合相同的流 struct

[Android][Room] 将密封类存储到 Room 数据库中

Compose Accompaniist Pager 中的 TabRow/Tab 重组问题

没有互联网连接时,Firebase Storage putFile() 永远不会完成

JetPack Compose - 卡片行中的权重()不起作用

如何在jetpack compose中创建自定义rememberState?

Android Material Date Range Picker - 如何仅更改所选范围日期的文本 colored颜色 ?

如何在 Jetpack Compose 中填充矢量图像的背景?

无法再查看 Jetpack Compose 预览.无法实例化一个或多个类 (ComposeViewAdapter)