【问题标题】:How to represent nested data in Firebase class如何在 Firebase 类中表示嵌套数据
【发布时间】:2016-01-05 18:13:16
【问题描述】:

取自 Firebase 示例,如果我有这样的恐龙事实数据结构:

{
  "lambeosaurus": {
    "name": "lamby",
    "work": "eat",
    "dimensions": {
      "height" : 2.1,
      "length" : 12.5,
      "weight": 5000
    }
  },
  "stegosaurus": {
    "name": "stego",
    "work": "play",
    "dimensions": {
      "height" : 4,
      "length" : 9,
      "weight" : 2500
    }
  }
}

如何在 Android 类中表示这个结构,以便 Firebase 从DataSnapshot.getValue(DinosaurFacts.class) 转换?

name、work都表示为Strings,但是类中的“dimensions”集合如何表示呢?

另外,我如何从DataSnapshot 访问关于身高和体重的数据值?

编辑 我可以让各个元素在快照中循环,但我试图找到如何在类结构中表示数据。

for(DataSnapshot child : dataSnapshot.getChildren()) {

                Log.d("hz-key:", child.getKey().toString());
                Log.d("hz-val:", child.getValue().toString());
            }

【问题讨论】:

  • 你有没有尝试过?
  • 是的,我可以使用 dataSnapshot.getChildren 获取单个数据 -> 获取值和键。但我想知道如何直接在我的 java 类中表示嵌套结构。刚刚更新了问题。

标签: android firebase firebase-realtime-database


【解决方案1】:

我遵循了弗兰克的回答,但我收到一条错误消息:

子类需要一个空的构造函数

即使我有一个。

解决方案:

为它创建一个新的(outer)类。


这是我的例子:

一等奖:

public class Event {

    private String name;
    private Place place;
}

子类:

public class Place {

     private String name;
     private Location location;

}

子类的子类:

public class Location {

     private String city;
     private Double longitude, latitude;

}

【讨论】:

  • 是的,您需要有一个空的构造函数才能使 firebase 数据类工作。此外,该类需要可序列化。
【解决方案2】:

表示这个结构的JavaBean类是:

public static class DinosaurFacts {
    String name;
    String work;
    Dimensions dimensions;

    public String getName() {
        return name;
    }

    public String getWork() {
        return work;
    }

    public Dimensions getDimensions() {
        return dimensions;
    }

    public class Dimensions {
        double height;
        long weight;
        double length;

        public double getHeight() {
            return height;
        }

        public long getWeight() {
            return weight;
        }

        public double getLength() {
            return length;
        }
    }
}

然后你可以阅读恐龙:

DinosaurFacts dino = dinoSnapshot.getValue(DinosaurFacts.class);

并通过以下方式访问维度:

dino.getDimensions().getWeight();

【讨论】:

  • 太棒了!谢谢。是的,通过单个类,我可以干净地封装所有自定义结构。
  • 如果我的子属性之一是整数数组怎么办?我会使用 List 数组来检索数据吗?我知道 firebase 将数组数据存储为一个对象,但是如何将其转换为 java 属性?
  • 注意子类如果有构造函数需要声明为static,否则会导致“...is missing a constructor with no arguments” (stackoverflow.com/a/39087010/1004331)
  • 如果维度有多个维度属性会怎样?像尺寸:{尺寸1:{“高度”:4,“长度”:9,“重量”:2500},尺寸2:{“高度”:4,“长度”:9,“重量”:2500},尺寸3: { “高度”:4,“长度”:9,“重量”:2500 }}
猜你喜欢
  • 1970-01-01
  • 2012-11-18
  • 2020-02-26
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-25
相关资源
最近更新 更多