Android Room:如何同时从两个表中读取 - 重复的id列

Tho*_*her 14 android android-room

我是Android Room的新手.我想从表中读取并从相关表中读取.这种关系非常普遍.一个表定义实例.另一个表定义了类型.想象一下Animal表和AnimalType表.几乎每次必须读取Animal表时,都需要读取AnimalType表.例如,我们想要显示动物名称(来自Animal表格)和猴子图标(来自AnimalType表格).

根据Android Room文档中的示例,这是对其进行建模的数据类:

public class AnimalWithType {
    @Embedded
    private Animal animal;

    @Embedded
    private AnimalType type;
    ...
Run Code Online (Sandbox Code Playgroud)

DAO可以使用单个查询查询数据.房间应该足够聪明,以填充两个子课程.

@Dao
public interface ZooDao
    @Query("select * from animal join animal_type on (animal.id = animal_type.id)")
    List<AnimalWithType> getAllAnimals();
Run Code Online (Sandbox Code Playgroud)

一如既往,理论很漂亮.现实被打破了.结果是以下错误:

Error:(8, 8) error: Multiple fields have the same columnName: id. Field names: animal > id, animalType > id.
Run Code Online (Sandbox Code Playgroud)

显然,Room对查询中只有一个"id"列以及它属于哪个类感到困惑.有两种可能的解决方案:1)我们可以为building_type.id创建一个列名别名,并告诉Room它.2)我们已经知道从Animal表到AnimalType表的外键(也许是animal_type_id)有另一个id列.

问题是我们如何与Room沟通.房间甚至能够处理这种情况吗?

关于如何解决这个问题的提示表示赞赏.我希望Room不需要做一些尴尬的事情就像给每个id列一个唯一的名字.

Tho*_*her 9

waqaslam为解决方案指明了方向。他建议为列名加上别名。附加步骤是为第二个表添加前缀。

public class AnimalWithType {
@Embedded
private Animal animal;

@Embedded(prefix = "type_")
private AnimalType type;
...
Run Code Online (Sandbox Code Playgroud)

列别名很长而且很乱。我希望有人可以找到一种更清洁的方法。

@Query("select animal.id, animal.name..., animal_type.id as type_id... from animal join animal_type on (animal.id = animal_type.id)")
Run Code Online (Sandbox Code Playgroud)


waq*_*lam 2

您需要专门提供列名称,而不是使用它*来收集所有字段,因为在两个表中都找到了id,因此会导致错误。将您的查询更改为:

select animal.id AS 'ID', animal.columnA, animal.columnB,
animal_type.columnA, animal_type.columnB from animal
join animal_type on (animal.id = animal_type.id)
Run Code Online (Sandbox Code Playgroud)

您不需要从两个表中获取 ID,因为它们是相同的,所以一个就足够了。但是,请将coulmnA、columnB 等替换为您要获取的有效列名称。