我正在制作一个训练日志(log)应用程序.

一项训练有多套.

我想把它存储在Roomone-to-many个关系中.

总之,我成功地保存了,但我不确定一个类能做什么.

所有其他示例示例代码都使用这个类,所以我自己创建了一个,但它没有告诉我它的含义.

WorkoutWithSets

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

以下两个实体类似乎足以表示一对多关系.(存放在房间内)

Workout

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

以下两个实体类似乎足以存储one-to-many个关系..(存储在房间中)

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 = "",
    var unit: WorkoutUnit = WorkoutUnit.kg,
    val parentWorkoutId: Long = 0
)

即使WorkoutWithSet类不存在,WorkoutWorkoutSetInfo类也存储在房间中.

WorkoutWithSets级意味着什么?(或者我应该在哪里使用它?)

推荐答案

WorkoutWithSets课程意味着什么?

它是一个类,可以通过一个简单的@Query来检索Workoutall以及相关的WorkoutSetInfo,该@Query只检索父训练.

Room所做的是添加一个额外的查询来检索每Workout个的子项(WorkoutSetInfo).

结果是一个训练列表,每个元素(一个训练)包含/包括all个相关训练集信息的列表.

当您想要处理一个训练(或多个训练)以及相关的训练集信息(也称为父训练的子训练集信息)时,可以使用此选项.

房间所做的是考虑要返回的类型(对象).

所以如果你有

@Query("SELECT * FROM workout")
fun getJustWorkouts(): List<Workout>

然后该函数将仅返回训练对象的列表.

但是如果你有

@Query("SELECT * FROM workout")
fun getWorkoutsWithSets(): List<WorkoutWithSets>

然后,该函数将返回包含训练集的训练列表,从而返回包含子训练集信息的父训练.

Room所做的是为提取的eack训练构建并执行一个底层查询,沿着"SELECT * FROM workoutInfoSet WHERE workout.workoutId = parentWorkoutId"行,因此它建议使用@Transaction注释(the build will include a warning if 101 is not coded).

Android相关问答推荐

RippleTheme在作曲material 1.7.0中被废弃

Jetpack Compose中的导航找不到NavHost类的名称为:startDestination";的参数

ERR_SSL_VERSION_OR_CIPHER_MISMATCH - Android Webview

jetpackcompose-如何对解析后的复杂对象进行状态提升?

Android 不在后台更新位置

同样的参数值下,为什么requiredSizeIn不等于requiredWidthIn + requiredHeightIn?

通知使用默认语言,屏幕显示多种语言,同时通过 AppCompatDelegate 设置应用程序语言

Android 模拟器 Wifi 连接没有互联网

如何在 Jetpack Compose 中创建无限pager

如何以编程方式通过 whatsapp android 共享图像和文本

在 react native 中设置 react-native-paper 组件的样式

Android:appcompat 和 material 如何从默认创建 appcompat 和 material 视图?

缺少类 com.google.android.datatransport.runtime.ForcedSender

在 Kotlin 中打开新片段时如何对当前片段应用更改?

Android 12 通过包管理器中断 APK 安装?

使用 Room 在 SQLite 中保存复杂的 JSON 响应

Kotlin Compose forEach 中的负间距

Google Play 控制台您的应用是否使用广告 ID?

我可以在不解密的情况下使用 JSch 获取加密的 SSH 私钥的类型或 fingerprint 吗?

如何满足设备内框架的无效 Wear OS 屏幕截图Wear OS 表盘策略违规?