如何使用Map <String,Obect>或List <object>类在Java中反编译嵌套的Firebase数据库?

Bor*_*hnN 7 android json firebase firebase-realtime-database

这是我简单的主要Firebase数据.

{
  "elephant" : {
    "color" : "gray",
    "lifespan" : 48,
    "status" : "endangered"
  }
}
Run Code Online (Sandbox Code Playgroud)

在我的android项目中,我创建了这个类来表示这些数据

public class elephant{
    private String color;
    private int lifespan;
    private String status;

    // Constructors
    public elephant(){
    }

    public elephant(String color, int lifespan, String status) { . . . }

    // Getters and Setters
    public String getColor() { return color; }

    public void setColor(String color) { this.color = color; }

    public int getLifespan() { return lifespan; }

    public void setLifespan(int lifespan) { this.lifespan = lifespan; }

    public String getStatus() { return status; }

    public void setStatus(String status) { this.status = status; }
}
Run Code Online (Sandbox Code Playgroud)

这样我就可以调用getValue(elephant.class)方法来检索这些数据.

Elephant ele = datasnapshot.getValue(elephant.class);
Run Code Online (Sandbox Code Playgroud)

有用.

现在我在我的项目中添加一个嵌套节点.

{
  "elephant" : {
    "color" : "gray",
    "lifespan" : 48,
    "status" : "endangered",
    "dimension" : {
      "height" : 270,
      "length" : 607
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

数据库图片

我在我的项目中创建了一个名为Dimension.java的新类:

public class Dimension {
    private int length, height;

    // Constructors
    public Dimension() { }

    public Dimension(int length, int height) { . . . }

    // Public getters and setters
    public int getLength() {return length;}

    public void setLength(int length) {this.length = length;}

    public int getHeight() {return height;}

    public void setHeight(int height) {this.height = height;}
}
Run Code Online (Sandbox Code Playgroud)

我修改了我的elephant.java以包含这个变量/对象:

private Dimension dimension;
Run Code Online (Sandbox Code Playgroud)

适当的构造函数,getter和setter.

我以前的方法仍然有效.它返回整个数据快照的正确java表示.

Elephant ele = datasnapshot.getValue(elephant.class);
Run Code Online (Sandbox Code Playgroud)

并且,如果我在DatabaseRef.child('dimension')获得数据快照,我可以将dimension.class传递给getValue()方法以获取正确的数据:

Dimension data = datasnapshot.getValue(dimension.class);
Run Code Online (Sandbox Code Playgroud)

因此,这些多功能课程对我来说非常方便.

现在,我知道,Firebase数据应该被标准化/展平.但是为了实验,我想说我已经用pushID添加了一些数据.

{
  "elephant" : {
    "color" : "gray",
    "status" : "endangered",
    "lifespan" : 48,
    "dimension" : {
      "height" : 270,
      "length" : 607
    },
    "population" : {
      "-KTcpw_SsMb55qLc6Xme" : {
        "count" : 210,
        "location" : "Bangladesh"
      },
      "-KTcq6YeB3kX3h9F9xPU" : {
        "count" : 428,
        "location" : "Bhutan"
      },
      "-KTcqDySLBAFtCuUc3R4" : {...},
      "-KTcqMyy4GULKo6FqPEM" : {...},
      "-KTcqWwtli672ROpry8_" : {...},
      "-KTcqhnBb6dTN1mA1otW" : {...}
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

数据库截图

现在,如果我想让以前的代码适用于这种情况:

Elephant ele = datasnapshot.getValue(elephant.class);
Run Code Online (Sandbox Code Playgroud)

如何为'population'节点编写新类.

在Firebase引用中,它表示它返回一个Map<String, Object>List<Object>java等价物.但作为Java的初学者,我在过去的4天里遇到了这个问题.

我可以遍历dataSnapshot.child('population')并将它们添加到单独的' population'对象列表中.但我想知道是否可以通过这种方式实现.请帮我编写代码或链接到一个示例,它在一行中自动完成.这将是一种解脱.

Aki*_*amu 5

你可以尝试这个:

class PopulationDetail {
    long count;
    String location;
}

class Elephan {
    ...
    Map<String, PopulationDetail> population;
    ...
}
Run Code Online (Sandbox Code Playgroud)