我知道以前曾以某种形式提出这个问题,但我发现的所有答案似乎都是检索一个对象列表,而不是一个对象,而我似乎只是围成一圈。
我正在使用Android Studio,连接到Firebase以获取数据库。我在我的应用程序中定义了自己的ChartColour对象,如下所示:
public class ChartColour {
private String key, name, description;
private int alpha, red, green, blue;
public ChartColour(String thisKey) {
this.key = thisKey;
}
public ChartColour(String thisKey, String thisName, int thisAlpha, int thisRed, int thisGreen, int thisBlue) {
this.key = thisKey;
this.alpha = thisAlpha;
this.red = thisRed;
this.green = thisGreen;
this.blue = thisBlue;
this.description = null;
}
@Exclude
public Map<String, Object> toMap() {
HashMap<String, Object> result = new HashMap<>();
result.put("key", key);
result.put("name", name);
result.put("description", description);
result.put("a", alpha);
result.put("r", red);
result.put("g", green);
result.put("b", blue);
return result;
}
}
在数据库中,样本记录如下:
colours
-- 5ha8hkwe253 (unique key for this chart)
-- a:0
-- b:255
-- description: "Base colour"
-- g:255
-- name: "Base"
-- r: 255
那么,如果我知道密钥,我该如何检索并设置ChartColour?到目前为止,我在ColourChart.java类中定义了此函数:
private void retrieveColourFromDatabase() {
DatabaseReference mColourReference = FirebaseDatabase.getInstance().getReference()
.child("colours").child(this.key);
mColourReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) {
ChartColour colour = userSnapshot.getValue(ChartColour.class);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
然而,这将它全部设置为'color'变量,对吧?但我希望它可以通过“this”访问。但如果我这样做:
this = userSnapshot.getValue(ChartColour.class);
在for循环中,它将'this'作为ValueEventListener,而不是ChartColour。我知道这可能很简单,但是我无法理解它,我想我已经绕圈子走了太多,以至于我迷惑了自己!我对Java相对较新,但没有帮助。
答案 0 :(得分:1)
您的ChartColour
不符合将数据编组到课程中的要求。您的班级必须满足以下两个属性:
- 该类必须具有不带参数的默认构造函数。
- 该类必须为要分配的属性定义公共getter。没有公共getter的属性将在反序列化实例时设置为默认值。
醇>
简而言之,将public ChartColour() {};
添加到您的类中,并根据非默认构造函数的每个参数添加一个Getter。然后拨打
ChartColour colour = userSnapshot.getValue(ChartColour.class);
如果您想使用this
,请将其更改为ChartColour.this
,假设这是您的外部类。