如何将Firebase数据转换为Java对象?

时间:2017-08-01 18:02:21

标签: java android firebase firebase-realtime-database

我知道以前曾以某种形式提出这个问题,但我发现的所有答案似乎都是检索一个对象列表,而不是一个对象,而我似乎只是围成一圈。

我正在使用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相对较新,但没有帮助。

1 个答案:

答案 0 :(得分:1)

您的ChartColour不符合将数据编组到课程中的要求。您的班级必须满足以下两个属性:

  
      
  1. 该类必须具有不带参数的默认构造函数。
  2.   
  3. 该类必须为要分配的属性定义公共getter。没有公共getter的属性将在反序列化实例时设置为默认值。
  4.   

简而言之,将public ChartColour() {};添加到您的类中,并根据非默认构造函数的每个参数添加一个Getter。然后拨打

ChartColour colour = userSnapshot.getValue(ChartColour.class);

如果您想使用this,请将其更改为ChartColour.this,假设这是您的外部类。