首页 > 解决方案 > 如何在 Android Room 中编写一对一(两个嵌入式实体的多个 pojo)

问题描述

如何编写一对多关系,其中许多是其他两个嵌入式实体的 pojo?一个 A 可能有多个 B,但每个 DataList 一个 A 可能只有一个 B。

这是我的代码的简化。

@Entity(tableName = "as")
public class A{
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "a_id")
    private int mId;

    @ColumnInfo(name = "a_type")
    private String mType;

    //getters and setters
}

@Entity(tableName = "bs")
public class B{
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "b_id")
    private int mId;

    @ColumnInfo(name = "b_type")
    private String mType;

    @ColumnInfo(name = "list_id")
    private int mListId;

    //getters and setters
}


@Entity(tableName = "data_lists")
public class DataList{
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "data_list_id")
    private int mId;

    //getters and setters
}

public class AandB {
    @Embedded
    private A mA;

    @Embedded
    private B mB;

    //getters and setters
}

public  class DataListWithAandBs{
    @Embedded
    private DataList mDataList;

    @Relation(
            parentColumn = "data_list_id",
            entityColumn = "list_id")
    private List<AandB> mAandBList;

    //getters and setters
}

@Dao
public interface DataListWithAandBsDao {

    @Query("SELECT * FROM data_lists LEFT JOIN (SELECT * FROM as LEFT JOIN bs ON a_type = b_type) ON list_id = data_list_id")
    LiveData<List<DataListWithAandBs>> getDataListsWithAsandBs();
}

编译时收到错误消息:该类必须是@Entity 或@DatabaseView。我不希望该列表成为一个实体,尽管我希望它是一个 Pojos 列表。这可能与房间有关吗?

标签: javaandroidandroid-room

解决方案


我相信您需要在关系上设置实体,如下所示:

public  class DataListWithAandBs{
    @Embedded
    private DataList mDataList;

    @Relation(
            parentColumn = "data_list_id",
            entityColumn = "list_id",
            entity = A.java
    )
    private List<AandB> mAandBList;

    //getters and setters
}

因为您想从另一个表中获取关系,但希望返回类型不是表的实体。

我在这个项目中做了类似的事情:https ://github.com/emmaguy/room-playground/blob/master/app/src/main/java/com/monzo/room_playground/Database.kt#L33


推荐阅读