如果用户只能在一个组中,那么user:group是多对一关系.

@Entity(tableName="user")
data class UserEntity(
  @PrimaryKey(autoGenerate = true)
  val uid: Int,
  val username: String,
  val groupId: Int
  ...
)

@Entity(tableName="group")
data class GroupEntity(
  @PrimaryKey(autoGenerate = true)
  val gid: Int,
  val name: String,
)

我可以使用POJO和左连接进行查询,这样:

data class UserWithGroup(
  @Embedded
  val user: UserEntity,
  @Embedded
  val group: GroupEntity,
)

@Dao
interface UserDao {

    @Transaction
    @Query("SELECT * FROM `user` u LEFT JOIN `group` g ON u.group_id = g.id")
    fun getAllUserWithGroup(): List<UserWithGroup>

}

是否有可能在userWithGroup中使用@Relation来获取用户群组?似乎互联网上的大多数示例都是通过用户列表获取群组,如何才能获得与@Relation相关群组的用户,就像下面的代码一样?

data class UserWithGroup(
  @Embedded
  val user: UserEntity,
  @Relation(
     parentColumn = "gid",
     entityColumn = "groupId",
  )
  val group: GroupEntity
)

@Dao
interface UserDao {

    @Transaction
    @Query("SELECT * FROM `user`")
    fun getAllUserWithGroup(): List<UserWithGroup>

}

推荐答案

我相信您的问题在于您的编码就好像集团是用户的母公司一样,而不是使用用户作为集团的母公司进行编码.所以:-

data class UserWithGroup(
    @Embedded
    val user: UserEntity,
    @Relation(
        entity = GroupEntity::class,
        parentColumn = "groupId",
        entityColumn = "gid",
    )
    val group: GroupEntity
)
  • 请注意,在这种情况下,entity=GroupEntity::class是可选的,但建议使用,因为如果@Relation的输出类型不是表,这是需要的(如果层次 struct 仅大于2个级别,它可以/将会是).

即,无论模式如何,@Embedded始终是@Relation(子)的父级.


Demo


使用上面的UserWithGroup类和您的代码(将@Insert添加到userDao)以及合适的(用于测试)@Database注释TheDatabase抽象类;然后:-

    db = TheDatabase.getInstance(this)
    dao = db.getUserDao()

    val g1id = dao.insert(GroupEntity(0,"G1"))
    val g2id = dao.insert(GroupEntity(0,"G2"))
    dao.insert(UserEntity(0,"U2",g1id.toInt()))
    dao.insert(UserEntity(0,"U3",g1id.toInt()))
    dao.insert(UserEntity(0,"U4",g2id.toInt()))
    dao.insert(UserEntity(0,"U5",g2id.toInt()))


    for (uwg in dao.getAllUserWithGroup()) {
        Log.d("DBINFO","User is ${uwg.user.username} ID uid is ${uwg.user.uid} groupId is ${uwg.user.groupId} Group is ${uwg.group.name} gid is ${uwg.group.gid}")
    }

日志(log)中的Result包括:-

2024-04-20 06:56:31.246 D/DBINFO: User is U2 ID uid is 1 groupId is 1 Group is G1 gid is 1
2024-04-20 06:56:31.246 D/DBINFO: User is U3 ID uid is 2 groupId is 1 Group is G1 gid is 1
2024-04-20 06:56:31.246 D/DBINFO: User is U4 ID uid is 3 groupId is 2 Group is G2 gid is 2
2024-04-20 06:56:31.246 D/DBINFO: User is U5 ID uid is 4 groupId is 2 Group is G2 gid is 2

Android相关问答推荐

列表的可变状态未正确更新

懒惰列的滚动到项目不按预期工作'

如何清除导航抽屉中以前 Select 的项目(Jetpack Compose)

使用Retrofit2的API调用:我如何能够一直进行API调用,以更新数据而无需重新打开应用程序

添加可组合元素的列表?

为什么我有多个Player实例?

Android 14预测性背部手势-闪烁的白色背景色

如何在android库中关联应用程序链接?

在本地通知中设置自定义声音

是否可以在 compose 中使用三次贝塞尔曲线进行动画?

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

如何将一个没有 GRADLE 的古老 Android 项目导入到今天的 Android Studio 中?

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

如何像 XML 一样在 Compose Android Studio 中折叠/展开小部件代码区域/区域

如何像 XML 一样在 Compose Android Studio 中折叠/展开小部件代码区域/区域

如何在 compose 中使用 BottomSheetScaffold 为底页设置半展开高度?

Android Studio 错误要求依赖它的库和应用程序针对 Android API 的 33 版或更高版本进行编译.

构成material 3 中的分隔符

单击登录按钮后从应用程序中退出

Сan 无法从 Firestore 获取数据,没有错误