2017-10-05 89 views
2

我试图将DataSnapshot值转换为对象。它的工作正常,我相信用于转换的bean构造函数(带参数)。我添加了一些代码行来执行某些操作,但我添加的代码行从未得到执行。样品bean类:Firebase实时数据库DataSnapshot值到对象转换

@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; } 
} 

火力地堡在线数据库流量: 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. 谷歌文档显示参数化的构造函数来设置属性,如果这是为什么不是我的代码执行?

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

回答

1

在你的情况下被调用构造函数是无参数的,因为你是从使用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; 
} 
2

这里

的火力地堡JSON解串器firebaser使用默认(无参数)构造函数,然后使用或者setter方法或公共字段设置的值。

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

我很可能会令getFullName()的计算值:

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

我重视私人的访问修饰符属性和默认的构造函数,并没有在我的bean类的setter方法,但对于火力firstName和lastName填充值。 –

+0

如果没有setter,Firebase会尝试查找与JSON属性匹配的字段并直接在该字段中设置值。 –

相关问题