我知道以前已经有人以某种形式问过这个问题,但是我发现的所有答案似乎都是在检索对象列表,而不是单个对象,而且我似乎只是在转圈。

我正在使用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

10-06 06:52