当前位置: 首页 > 知识库问答 >
问题:

合并多个LiveData源?

南门烈
2023-03-14

我正在使用RoomDatabase、存储库、Viewmodel和LiveData。区域与网关有1到n的关系,网关与项有1到n的关系。我创建了一个AreaWithGateways实体和一个GatewayWithItems实体。

项可以从一个网关移动到另一个网关,这就是为什么我用Livedata观察它们,以跟踪它们在哪个网关中。我现在的问题是,我发现自己也需要跟踪哪些项目在哪些区域,我不知道如何做到这一点。

我想过将每个网关的LiveData合并在一起,并使用MediatorLiveData来观察这一点,但我并不真正理解如何使用它。或者也许可以创建一个实体areaWithGatewaysWithItems?

编辑:我正在添加一些代码以使问题更加清楚

这是区域实体

@Entity(tableName = "area_table")
public class Area {

    @PrimaryKey(autoGenerate = false)
    private int areaId;

    private String areaName;
    private float wertX;
    private float wertY;
    private Boolean isDrawn;


    public int getAreaId() {
        return areaId;
    }

    public void setAreaId(int areaId) {
        this.areaId = areaId;
    }

    public String getAreaName() {
        return areaName;
    }

    public float getWertX() {
        return wertX;
    }

    public float getWertY() {
        return wertY;
    }

    public Boolean getDrawn() {
        return isDrawn;
    }

    public Area(int areaId, String areaName, float wertX, float wertY, Boolean isDrawn) {
        this.areaId = areaId;
        this.areaName = areaName;
        this.wertX = wertX;
        this.wertY = wertY;
        this.isDrawn = isDrawn;
    }
}

网关实体:

@Entity(tableName = "gateway_table")
public class Gateway {
    
    private float temp;
    private String title;
    private int areaId;


    @PrimaryKey(autoGenerate = false)
    private int gatewayId;

    public int getGatewayId() {
        return gatewayId;
    }

    public void setGatewayId(int gatewayId) {
        this.gatewayId = gatewayId;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public float getTemp() {
        return temp;
    }

    public void setTemp(float temp) {
        this.temp = temp;
    }

    public int getAreaId() {
        return areaId;
    }

    public Gateway(int areaId, int gatewayId, String title) {
        this.title = title;
        this.areaId = areaId;
        this.gatewayId = gatewayId;
    }
}
@Entity(tableName = "cow_table")
public class Cow {

    private int age;
    private String sex;
    private String name;
    private boolean drawn;
    private int gatewayId;
    private String raceId;


    @PrimaryKey(autoGenerate = false)
    private int cowId;

    public int getCowId() {
        return cowId;
    }

    public void setCowId(int cowId) {
        this.cowId = cowId;
    }

    public String getName() {
        return name;
    }


    public boolean isDrawn() {
        return drawn;
    }

    public int getAge() {
        return age;
    }

    public String getSex() {
        return sex;
    }

    public void setDrawn(boolean drawn) {
        this.drawn = drawn;
    }

    public int getGatewayId() {
        return gatewayId;
    }

    public String getRaceId() {
        return raceId;
    }

    public Cow(int age, int cowId, int gatewayId,String name, String raceId, String sex, boolean drawn) {

        this.age = age;
        this.cowId = cowId;
        this.sex= sex;
        this.name = name;
        this.drawn = drawn;
        this.gatewayId = gatewayId;
        this.raceId = raceId;
    }


}
public class AreaWithGateways {

    @Embedded
    private Area area;

    @Relation(parentColumn = "areaId",
    entityColumn = "areaId")
    private List<Gateway> gatewayList;

    public Area getArea() {
        return area;
    }

    public List<Gateway> getGatewayList() {
        return gatewayList;
    }

    public AreaWithGateways(Area area, List<Gateway> gatewayList) {
        this.area = area;
        this.gatewayList = gatewayList;
    }
}

public class GatewayWithCows {

    @Embedded
    private Gateway gateway;

    @Relation(parentColumn = "gatewayId",
            entityColumn = "gatewayId")
    private List<Cow> cowList;

    public Gateway getGateway() {
        return gateway;
    }

    public List<Cow> getCowList() {
        return cowList;
    }

    public GatewayWithCows(Gateway gateway, List<Cow> cowList) {
        this.gateway = gateway;
        this.cowList = cowList;
    }
}

共有1个答案

谭修竹
2023-03-14

或者也许可以创建一个实体areaWithGatewaysWithItems?

不是一个实体,因为这些实体用于定义表,而是通过POJO使用@Embedded和@Relations注释(例如,您的GatewayWithCows是一个POJO)。

我觉得我应该以某种方式使用AreaWithGateways将LiveData项添加到一起,但我无法通过gateways到达这些项,必须反过来。

class AreaWithGatewayWithCows {

    @Embedded
    Area area;
    @Relation(entity = Gateway.class, parentColumn = "areaId",
            entityColumn = "areaId")
    List<GatewayWithCows> gatewayWithCowsList;

}

>

  • 注意:我错过了类名的s后网关(在下面的查询中也是如此)

    注意,需要使用entity=Gateway.class,因为关系是通过网关而不是通过GatewayWithCows(不是表)。

    查询Dao可以简单到:-

    @Query("SELECT * FROM area_table")
    List<AreaWithGatewayWithCows> getAreaWithGatewaysWithCows();
    
    • 为LiveData进行了相应修改。
    • 注意,如果在查询中使用联接,那么any子句(如WHERE)只会影响区域,而不会影响底层网关和COW。也就是说,不管查询如何,@relations用与该区域相关的所有网关构建每个区域;每个网关获取与该网关相关的所有cow。

  •  类似资料:
    • (注意这不是按字母顺序,蓝莓排在狒狒之前) 当然,只要有一个列表不是空的,我就可以用一个计数器在“superlist”中循环,一个接一个地向resultslist中添加项目: 但最好使用一些优化的LINQ函数来实现这一点。我一直在研究Zip、GroupBy和Aggregate,但无法使它们工作。 那么:有没有一个漂亮的LINQ函数,或者多个函数的组合,可以把它变成漂亮的代码,或者我应该坚持(也许优

    • 问题内容: 我整个上午都在搜索,但是大多数合并示例仅基于一个键,而在多个键上却找不到任何东西。 pid = 111,sid = 6,eid = 123的值在x和y中都匹配,然后合并为一条记录。如果它们不匹配,只需将其原样带过来。 我想要的最终结果: 问题答案: 这是从元组中重新锁定:

    • 我有索引,其中每个文档都有这样的结构: 我需要计算每个演员对应的电影数量(演员可以在actor_1_name、actor_2_name或actor_3_name字段中) 这3个字段的映射是: 有没有一种方法,我可以聚合的结果,可以结合所有3个演员领域的条款,并给出一个单一的聚合。 目前,我正在为每个actor字段创建单独的聚合,并通过我的JAVA代码将这些不同的聚合合并成一个。 通过创建不同的聚合

    • 我是Apache GraphX的新手,我想看看是否可以在GraphX中进行图形合并/合并。我想做的是说我有下面的2个图

    • 操作步骤: ①在"图层管理"模块,选择图层,点击"更多"按钮。 ②点击"复制数据密钥"按钮。 ③弹出"复制数据密钥窗口",点击"复制"按钮。 ④进入想要合并的地图,点击地图右上工具条上的"数据密钥"按钮。 ⑤弹出"导入数据密钥窗口",粘贴刚才复制的密钥,点击"导入"按钮,数据在地图导入成功。 提示: ●复制图层数据参考复制拷贝图层 操作动图: [查看原图]

    • 问题内容: 说我有a.so和b.so。我是否可以将c.so生成为具有a和b导出的所有功能的单个共享库,当然可以解决所有内部依赖关系(即a.so调用的b.so的所有功能,反之亦然)? 我试过了 但这不起作用。 如果我在aa和ba中归档ao和bo(也不应修改ao和bo),也是如此 谢谢 问题答案: 除了AIX之外,在所有UNIXen上实际上都不可能将多个共享库合并为一个:链接器将.so视为“最终”产品