Android Room多对多关联异常:二级关联VPub列表返回为空求助
错误1:多对多关联配置缺失(仅Account和Channel为多对多关系时需修复)
你之前的AccountWithChannels类中Account和Channel的多对多关联用了@Junction绑定中间表AccountChannelCrossRef,但AccountWithChannelsAndVpubs中的@Relation错误使用了entityColumn = "accountId"直接关联,如果Channel表中没有accountId字段(多对多场景下不会存储该字段),关联逻辑本身就存在问题。
修复AccountWithChannelsAndVpubs的@Relation配置,补全多对多中间表关联即可:
public class AccountWithChannelsAndVpubs { @Embedded public AccountEntity account; @Relation( entity = ChannelEntity.class, parentColumn = "accId", entityColumn = "channelId", associateBy = @Junction(AccountChannelCrossRef.class) // 补全多对多中间表配置 ) public List<ChannelWithVpubs> channelWithVpubs; // 其余getter、setter保持不变 }
如果你的Account和Channel是一对多关系,Channel表中确实存在accountId字段,则可忽略本条修改。
错误2:未将中间表加入Database实体列表
Room要求所有用到的实体(包括多对多关联的中间表)都必须在@Database注解的entities参数中声明,如果你没有把ChannelVpubCrossRef加入列表,Room无法查询中间表关联数据,会直接返回空的VPub列表。
检查你的Database类配置,确保包含所有中间表:
@Database(entities = {AccountEntity.class, ChannelEntity.class, VPubEntity.class, AccountChannelCrossRef.class, ChannelVpubCrossRef.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { // 其余配置保持不变 }
错误3:中间表关联数据未插入
多对多关联不会自动写入中间表数据,你需要手动插入ChannelVpubCrossRef的关联记录,仅插入ChannelEntity和VPubEntity的独立数据无法建立两者的关联关系,自然查询不到对应VPub列表。
错误4:主键类型不匹配
检查ChannelEntity的channelId、VPubEntity的vPubId字段类型,必须和ChannelVpubCrossRef中对应字段类型完全一致,如果一个是long、一个是int,会导致关联查询匹配不到结果,返回空列表。
内容的提问来源于stack exchange,提问作者Dimitri Payet

