2017-10-05 8 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; } 
} 

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オブジェクトで終了した後にコードを追加するにはどうすればよいですか?

答えて

1

DataSnapshot。ドキュメントによると、これらのカスタムJavaクラスにDataSnapshotデータを取得するために従わなければならないルールです:

  • クラスには引数

  • クラスをとらないデフォルトコンストラクタを持っている必要がありますプロパティを割り当てるためのパブリックゲッターを定義する必要があります。パブリック・ゲッターのないプロパティーは、インスタンスがデシリアライズされるときにデフォルト値に設定されます。

私はあなたが同じgetFullName()方法でそれを行うことができますfullNameプロパティの値を設定します。

2

ここfirebaser

Firebase JSONのデシリアライザは、デフォルト(パラメータなし)コンストラクタを使用して、値を設定するためのsetterメソッドまたはpublicフィールドのいずれかを使用しています。

ほとんどのサンプル(および私が書いたほとんどの実際のコード)には、オブジェクトの通常の作成用にパラメータ化されたコンストラクタがありますが、そのパラメータ化されたコンストラクタはFirebaseでは使用されません。

私はおそらくgetFullName()計算値になるだろう:あなたは内の値をマップするために必要とされるgetValue()を使用してデータベースから読んでいるので、呼び出されるコンストラクタは、パラメータなしであなたのケースでは

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

私はプロパティとデフォルトのコンストラクタにプライベートアクセス修飾子を添付し、Beanクラスにはセッターメソッドがありませんが、firebaseはfirstNameとlastNameの値を埋めます。 –

+0

設定者がいない場合、FirebaseはJSONプロパティに一致するフィールドを見つけようとし、そこに直接値を設定します。 –

関連する問題