2016-06-24 8 views
1

私のアプリでは、保存ボタンをクリックすると2つの異なる場所にある2セットのデータをpush()で作成する必要があります。 idが必要です。同じメソッドの2番目のpush()は動作しません

私はfirstのために得た結果は、私が期待どおりにしたが、secondのため、代わりにsecond/<userId>/<key>/<keySecond>/childrenを作成するので、私はこれを取得

String userId = auth.getCurrentUser().getUid().toString(); 
DatabaseReference reference = FirebaseDatabase.getInstance().getReference(); 
DatabaseReference firstDatabaseRef = reference.child("first"); 
DatabaseReference secondDatabaseRef = reference.child("second").child(userId); 



String key = firstDatabaseRef.child(userId).push().getKey(); 
First first = new First(firstAmount,key,firstName); 
Map<String, Object> firstValues = first.toMap(); 


String keySecond = secondDatabaseRef.child(key).push().getKey(); 
Second second = new Second(secondName,secondAmount,keySecond,key); 
Map<String, Object> secondValue = second.toMap(); 

Map<String, Object> childUpdates = new HashMap<>(); 
childUpdates.put("/first/" + userId + "/" + key, firstValues); 
childUpdates.put("/second/" + userId + "/" + key + "/" + keySecond, secondValue); 
reference.updateChildren(childUpdates); 

をFirebaseガイドのサンプルコードに続き、第2のプッシュを追加しました:

"second" : { 
    //userId 
    "5TQLPlGf4mbcBRKesQwR30fH1L22" : { 
     //key 
     "-KL1030IywlNpkTGC7mU" : { 
     "secondAmount" : "147", 
     "Key" : "-KL1030IywlNpkTGC7mU", 
     "secondName" : "secondName", 
     "keySecond" : "-KL1030PZlHqD_asSR_8", 
     } 
    } 
} 

代わりの方法によりkeySecondに記録されている別の固有のID、最終子どもを持つ、彼らはすべてのキーに直接追加されます。 keyにはすべてkeySecondが必要なので、これは受け入れられません。 私は自分の問題を正しく説明してくれることを願っています。 私が間違っていることを教えてください。 私のコードを変更するか、データ構造を完全に再考すべきですか?

答えて

0

updateChildren()を処理すると、Firebaseデータベースは渡された子をループし、キーごとに渡した値が本来setValue()になります。

つまり、重複するキーを持つ子を持つ場合、それらのキーの1つの値が最後に書き込まれます。これらの順序は未定義です。

あなたのケースでは、更新を一緒にマージするのはとても簡単です:

String key = firstDatabaseRef.child(userId).push().getKey(); 
First first = new First(firstAmount,key,firstName); 
Map<String, Object> firstValues = first.toMap(); 

String keySecond = secondDatabaseRef.child(key).push().getKey(); 
Second second = new Second(secondName,secondAmount,keySecond,key); 
Map<String, Object> secondValue = trans.toMap(); 
firstValues.put(keySecond, secondValue); // This is the main change 

Map<String, Object> childUpdates = new HashMap<>(); 
childUpdates.put("/first/" + userId + "/" + key, firstValues); 
reference.updateChildren(childUpdates); 
+0

本当にありがとうございます。私はあなたの提案をしましたが、私はまったく同じ結果を得ています。 – Ramtin

+0

@フランク:あなたの解決策は、存在しない問題を解決すると思います。 'childUpdates'の2つの子は' first'と 'second'にあります。彼らの価値は重複しないのですか? –

+0

ああ、そうですね。いいキャッチ!私はそれを完全に見落とした。ハッシュマップをスキャンすることに戻る... –

2

これはパズルです。あなたが掲示したコードをコピー/貼り付け、FirstSecondのスタブを作成しました。 Firebase 9.0.2を実行すると、次のような結果が得られました。これはあなたが期待していると思います。別のFirebaseバージョンで実行していますか?投稿したJSONが投稿したコードの別のバージョンで作成された可能性はありますか?

{ 
    "first" : { 
    // userId 
    "ypx8RB3eglTBRPeUT7laQVQ1PZQ2" : { 
     // key 
     "-KL3rXeYrscFQNrVQnHb" : { 
     "firstAmount" : "FirstAmount", 
     "firstKey" : "-KL3rXeYrscFQNrVQnHb", 
     "firstName" : "FirstName" 
     } 
    } 
    }, 
    "second" : { 
    // userId 
    "ypx8RB3eglTBRPeUT7laQVQ1PZQ2" : { 
     // key 
     "-KL3rXeYrscFQNrVQnHb" : { 
     // keySecond 
     "-KL3rXe_JyY9Vz2U-NES" : { 
      "Key" : "-KL3rXeYrscFQNrVQnHb", 
      "keySecond" : "-KL3rXe_JyY9Vz2U-NES", 
      "secondAmount" : "SecondAmount", 
      "secondName" : "SecondName" 
     } 
     } 
    } 
    } 
} 
+0

あなたの答えに感謝します。入力ミスで申し訳ありません、私はそれを修正しました。私は9.0.2のFirebaseと同じバージョンを使用しており、複数のユーザーでコードを試してみました。コードで適切な結果が得られた場合は、その問題の原因となっている別のものが存在する可能性があります。 – Ramtin

+0

もう一度私はあなたの答えをありがとう、私はまだ私はその結果を得ていた、私はまったく同じコードを使用して同様のプロジェクトを再現し、今働いているのか分からない。私は本当に困惑だった。 – Ramtin

関連する問題