我知道以前已经有人以某种形式问过这个问题,但是我发现的所有答案似乎都是在检索对象列表,而不是单个对象,而且我似乎只是在转圈。
我正在使用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) {
}
});
}
但是,这全部设置为“ colour”变量,对吗?但是我希望可以通过“ this”访问它。但是,如果我这样做:
this = userSnapshot.getValue(ChartColour.class);
在for循环中,它将“ this”作为ValueEventListener而不是ChartColour。我知道这可能真的很简单,但是我实在无法理解,我想我已经转了很多圈,以至于使自己感到困惑!我对Java相对较新,但没有帮助。
最佳答案
您的ChartColour
不符合将数据编组为类的要求。您的课程必须满足以下两个属性:
该类必须具有不带参数的默认构造函数。
该类必须为要分配的属性定义公共获取方法。反序列化实例时,没有公共获取器的属性将设置为其默认值。
简而言之,将public ChartColour() {};
添加到您的类中,并为非默认构造函数的每个参数添加一个Getter。然后打电话
ChartColour colour = userSnapshot.getValue(ChartColour.class);
如果要使用
this
,请假定它是您的外部类,将其更改为ChartColour.this
。