gpt4 book ai didi

java - Spring Boot + React JS + Firebase 实时数据库

转载 作者:行者123 更新时间:2023-12-04 08:44:10 26 4
gpt4 key购买 nike

后端:Springboot
前端:ReactJS
CloudRepo:Firebase 实时数据库

  • 我有一个从 Firebase 实时数据库获取数据的 Springboot 应用程序。
  • 然后通过来自 reactJS 的 GET 请求提供这些数据。

  • 我在 reactJS 中得到 JSON 对象为:
    enter image description here
    我想要做的是将 firebase 快照映射到 Java 集合。这是我到目前为止所做的:
    DatabaseReference ref = FirebaseService.getFirebaseDatabase().getReference("/devices/device1");
    ref.addValueEventListener(new ValueEventListener() {
    public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot messageSnapshot: dataSnapshot.getChildren()) {
    DeviceData message = messageSnapshot.getValue(DeviceData.class);
    System.out.println(message);
    }

    Map<String, DeviceData> document = (Map<String, DeviceData>) dataSnapshot.getValue();
    setUpdatedDocumentData(document);
    }

    public void onCancelled(DatabaseError error) {
    System.out.print("-----Error-----:\n" + error.getMessage());
    }
    });
    我的 POJO 看起来像这样:
    public class DeviceData {
    String sensor_1;
    String sensor_2;

    public DeviceData() {}

    public DeviceData(String sensor_1, String sensor_2) {
    this.sensor_1 = sensor_1;
    this.sensor_2 = sensor_2;
    }

    public String getSensor_1() {
    return sensor_1;
    }

    public void setSensor_1(String sensor_1) {
    this.sensor_1 = sensor_1;
    }

    public String getSensor_2() {
    return sensor_2;
    }

    public void setSensor_2(String sensor_2) {
    this.sensor_2 = sensor_2;
    }

    @Override
    public String toString() {
    return "DeviceData{" +
    "sensor_1='" + sensor_1 + '\'' +
    ", sensor_2='" + sensor_2 + '\'' +
    '}';
    }
    }
    我的 sensor_1 和 sensor_2 日志中出现空值。如何将上述 firebase 结构映射到集合?

    最佳答案

    下各/devices/$device节点,您有两个嵌套级别:

  • 对于日期
  • 对于时间。

  • 您的代码仅在设备节点的子节点上循环一次,因此您的 messageSnapshot变量实际上是一个快照,其中包含特定日期的所有时间戳的所有数据。
    要正确处理您的结构,您需要两个嵌套循环:
    DatabaseReference ref = FirebaseService.getFirebaseDatabase().getReference("/devices/device1");
    ref.addValueEventListener(new ValueEventListener() {
    public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot dateSnapshot: dataSnapshot.getChildren()) {
    for (DataSnapshot timeSnapshot: dataSnapshot.getChildren()) {
    DeviceData message = timeSnapshot.getValue(DeviceData.class);
    System.out.println(message);
    }
    }

    Map<String, DeviceData> document = (Map<String, DeviceData>) dataSnapshot.getValue();
    setUpdatedDocumentData(document);
    }

    public void onCancelled(DatabaseError error) {
    System.out.print("-----Error-----:\n" + error.getMessage());
    }
    });

    如果只关心最新日期的最新时间戳,可以通过只获取最新日期来减少从数据库读取的数据量:
    DatabaseReference ref = FirebaseService.getFirebaseDatabase().getReference("/devices/device1");
    ref.orderByKey().limitToLast(1).addValueEventListener(new ValueEventListener() {
    public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot dateSnapshot: dataSnapshot.getChildren()) {
    for (DataSnapshot timeSnapshot: dataSnapshot.getChildren()) {
    DeviceData message = timeSnapshot.getValue(DeviceData.class);
    System.out.println(message);
    }
    }

    Map<String, DeviceData> document = (Map<String, DeviceData>) dataSnapshot.getValue();
    setUpdatedDocumentData(document);
    }

    public void onCancelled(DatabaseError error) {
    System.out.print("-----Error-----:\n" + error.getMessage());
    }
    });
    您仍然需要读取该日期的所有时间戳,但至少您现在只读取最近一天的数据。

    关于java - Spring Boot + React JS + Firebase 实时数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64413173/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com