2016-03-25 5 views
1

FirebaseのvalueEvenListenerに問題があります。Firebase updatechildren vs setvalue

Firebase ref = new Firebase(Constant.BASEURL).child("myLists"); 
ref.addValueEventListener(myValueEventListener); 

次に、updateChildren()を使用してリスト値の1つを更新しようとします。

HashMap<String, Object> newEditionTimeHM = new HasMap<String, Object> 
newEditionTimeHM.put("editionTimeStamp", ServerValue.TIMESTAMP); 

ref.child(pushKey).updateChildren(newEditionTimeHM); 

それは更新しますが、私のリスナーが更新をキャッチしたときに、それが報告クラッシュし、エラーを「と入力してバウンスすることができませんでした」。

私の2回目の試行では、私が望む新しい値で新しいshoppinListオブジェクトを作成し、setValue()を使ってそれを押します。

newEditionTimeHM.put("editionTimeStamp", ServerValue.TIMESTAMP); 
ShoppingList shoppingList = new ShoppingList("Owner unknown", newEditionTimeHM); 

ref.child(pushKey).setValue(shoppingList); 

リスナーがそれをキャッチしても、問題は報告されません。

ここでの違いは何ですか?リスナーを満たすために全く新しいオブジェクトを作成する必要があるのはなぜですか? updateChildren()を使用する方が効率的ではありませんか? 答えはthis pageでしたが、見つからなかった

+0

"バウンスに失敗した"場合は、結果のデータ(onDataChange)が他のケースと異なる場合があります。その違いをデバッグして確認し、結論を導きます。 – Wukash

+0

@Wukashチェックしました。これらの2つの方法はまったく同じことを行う必要があります。その証拠は、私がファイヤーベースの最終結果をチェックするとき、私は最初のメソッドまたは2番目のメソッドを使用して全く同じものを取得するということです。違いは、リスナーがどのように反応するかです。 –

+0

はい私は、サーバー上の値が最終結果で同じであることを理解しています。私が言ったことは、リスナーの方法の違いを確認し、それに応じて行動する必要があるということです。私たちがfirebaseライブラリの振る舞いを変えることができないことを意味するので、それはあなたの唯一の選択肢です... – Wukash

答えて

2

ServerValue.TIMESTAMPはタイプがMap<String, String>で持っているので、あなたのpushKeyが"<your Firebase URL>/myLists"ある場合、私はFirebaseでのデータ構造は、これに関連していると思います:

"myLists": { 
    "editionTimeStamp": { 
     "timeStampKey": "timeStampValue" 
    } 
} 

だから、あなたはTIMESTAMP値を取得したい場合、私はあなたの最初の提案します彼にそれを願っていますWhy do I get "Failed to bounce to type" when I turn JSON from Firebase into Java objects?

ref.child("<your Firebase URL>/myLists/editionTimeStamp/timeStampKey"); 
ref.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot snapshot) { 
     String timeStampValue = (String)snapshot.getValue(); 
    } 
    @Override 
    public void onCancelled(FirebaseError firebaseError) { 
     System.out.println("The read failed: " + firebaseError.getMessage()); 
    } 
}); 

それはあなたの解決策ではない場合は、ここではこのエラーについての良い説明がある:でなければならないを試してみてくださいlp:D

0

問題が見つかりました。私はthis pageを読んで、上記の答えは私がfirebaseのリスナーがどのように働いているのか誤解していることに気付きました。 setValue()とupdateChildren()に反応することには違いがあります。更新後に必要な値を確認し、それに応じてChildEventListenerまたはValueEventListenerを使用してください。 人生はもう一度良いです!乾杯!

+0

thanks @johny。私はそれを念頭に置いておきます。 –