Firebase实时数据库DataSnapshot值到对象转换

时间:2017-10-05 14:03:27

标签: android firebase firebase-realtime-database

我正在尝试将DataSnapshot值转换为object。它工作正常,我相信bean构造函数(带参数)用于转换。我添加了一些代码行来执行一些操作,但是我添加的代码行永远不会被执行。示例bean类:

@IgnoreExtraProperties
public class DatabaseRecord {

    private String firstName;
    private String lastName;
    private String fullName;

    private DatabaseRecord() {
    }

    public DatabaseRecord(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
        // following code not executing
        this.fullName = firstName + lastName;
    }

    public String getFirstName() { return firstName; }
    public String getLastName() { return lastName; }
    public String getFullName() { return fullName; }
}

Firebase在线数据库流程: enter image description here

数据获取执行代码:

DatabaseReference databaseReference = database.getReference("/user/user1");
databaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        DatabaseRecord record = dataSnapshot.getValue(DatabaseRecord.class);
        Log.d(TAG, record.getFirstName()+":"+record.getLastName()+":"+record.getFullName());
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
    }
});

输出:

  

萨蒂什南比亚:潘迪:空

  1. Google文档显示了用于设置属性的参数化构造函数,如果不是我的代码执行的原因就是这种情况?

  2. 如何在google转换完成后在同一个bean对象中附加我的代码?

2 个答案:

答案 0 :(得分:2)

firebaser here

Firebase JSON反序列化程序使用默认(无参数)构造函数,然后使用setter方法或公共字段来设置值。

大多数样本(以及我编写的大多数实际代码)都有一个参数化构造函数,用于定期创建对象,但Firebase不使用该参数化构造函数。

我可能会将getFullName()设为计算值:

public String getFullName() { return firstName + lastName; }

答案 1 :(得分:2)

在您的情况下,被调用的构造函数是无参数的,因为您使用getValue()从数据库中读取,这是映射DataSnapshot中的值所必需的。根据文档,这些是您必须遵循的规则,以便将DataSnapshot数据转换为自定义Java类:

  
      
  • 该类必须具有不带参数的默认构造函数

  •   
  • 该类必须为要分配的属性定义公共getter。在反序列化实例时,没有公共getter的属性将设置为其默认值。

  •   

我想在同一个fullName方法中设置属性getFullName()的值。像这样:

public String getFullName() { 
    if(fullName == null){// it will be null the first time assuming the value doesn't exist in the database.
       fullName = getFirstName() + getLastName();
    }
    return fullName; 
}