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'对象列表中.但我想知道是否可以通过这种方式实现.请帮我编写代码或链接到一个示例,它在一行中自动完成.这将是一种解脱.
你可以尝试这个:
class PopulationDetail {
long count;
String location;
}
class Elephan {
...
Map<String, PopulationDetail> population;
...
}
Run Code Online (Sandbox Code Playgroud)