且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Android房间多对多连接表获得超过2个表的关系

更新时间:2021-11-23 16:14:45

据我所知,不幸的是,没有开箱即用的方法,即如何仅使用聊天室的工具(@Relation、@Embedded、@Junction)解决您的用例。

我的第一个问题是,据我所见,我对连接表或关联表没有太多经验,它们只存储应该关联的表的外键,可以在连接表中添加值字段吗?

问题是@Junction在使用上有一些限制-它只有助于将两个表与保存在第三个(连接)表中的值绑定。但是@Relation-with-@Junction API不支持从该连接表获取任何要包含到结果类的字段(这些外键仅用于绑定)。这就是为什么从技术上讲,您可以将一些字段添加到连接表中(它似乎是您应该保存这些值的最合适位置),但实际上您无法使用@Junction获取这些字段。

也许有一些黑客方法可以用来实现这一点,但我猜-您必须使用SQL连接实现您自己的方法,并使用循环传递结果以形成所需的结果(类似于您在帖子中提到的链接中实现的方法)。

作为您的简化,您可以真正按照您的建议描述实体连接表(但根本不使用@Junction):

data class UserPropertyJunction(
    val userAccountId: Long,
    val propertyId: Int,
    val displayCount:Int=0,
    val favorite:Boolean=false
)

然后添加辅助类(非实体)作为查询结果:

data class UserWithFavorites(
    val displayCount:Int,
    val favorite:Boolean,
    @Relation(
         parentColumn = "userAccountId",
         entityColumn = "userId"
    )
    val user: UserEntity,
    @Relation(
         parentColumn = "propertyId",
         entityColumn = "id"
    )
    val property: Property,
)

当然,这不是您想要的,但至少您可以处理它,它是开箱即用的,您可以对其使用LiveData/Flow/RxJava(例如,在获得它之后,您可以尝试使用一些转换操作符以某种方式将其更改为所需的格式)

更新(简化版)

如果您的结果中不需要用户,但是您只想通过userID来过滤,那么您的辅助类可以如下所示:

data class PropertiesWithFavorites(
    val displayCount:Int,
    val favourite:Boolean,
    val propertyId: Long,
    @Relation(
         parentColumn = "propertyId",
         entityColumn = "id"
    )
    val property: Property
)

和道法:

@Query("SELECT * FROM user_property_junction as j where j.userAccountId =:userId")
fun getPropertiesByUser(userId: Long): List<PropertiesWithFavorites>