我正在尝试将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; }
}
数据获取执行代码:
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) {
}
});
输出:
萨蒂什南比亚:潘迪:空
Google文档显示了用于设置属性的参数化构造函数,如果不是我的代码执行的原因就是这种情况?
如何在google转换完成后在同一个bean对象中附加我的代码?
答案 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;
}