ユーザーノードにsubscribedTo
という配列があります。ここで、ユーザーがサブスクライブするたびに、その配列にPush ID's
を追加したいと思います。
しかし、Push ID
は追加されるのではなく、置き換えられています。
プッシュIDをアレイに追加するにはどうすればよいですか?
スキーマ
"tester@gmail,com": {
"email": "tester@gmail,com",
"hasLoggedInWithPassword": true,
"name": "tester",
"subscribedTo": [
"-KFPi5GjCcGrF-oaHnjr"
],
"timestampJoined": {
"timestamp": 1459583857967
}
}
[〜#〜]コード[〜#〜]
public void onSubscribe(View v) {
final Firebase firebaseRef = new Firebase(Constants.FIREBASE_URL);
final HashMap<String, Object> userMap = new HashMap<String, Object>();
pushIDList.add(PROG_ID);
userMap.put("/" + Constants.FIREBASE_LOCATION_USERS + "/" + mEncodedEmail + "/subscribedTo",
pushIDList);
firebaseRef.updateChildren(userMap, new Firebase.CompletionListener() {
@Override
public void onComplete(FirebaseError firebaseError, Firebase firebase) {
Toast.makeText(ProgramDetail.this, "You are subscribed", Toast.LENGTH_SHORT).show();
}
});
}
マップでupdateChildren()
を呼び出すと、Firebaseは各キーを取得し、その場所にあるオブジェクトをマップの値に置き換えます。
updateChildren()
に関するFirebaseのドキュメントには、次のように記載されています。
alanisawesome
のような単一のキーパスが与えられた場合、updateChildren()
は最初の子レベルでのみデータを更新し、最初の子レベルを超えて渡されたデータはsetValue()操作として扱われます。
したがって、あなたの場合、_"/" + Constants.FIREBASE_LOCATION_USERS + "/" + mEncodedEmail + "/subscribedTo"
_の内容全体を置き換えています。
解決策は、マップのキーの_PROG_ID
_部分を作成することです。
_userMap.put("/" + Constants.FIREBASE_LOCATION_USERS + "/" + mEncodedEmail + "/subscribedTo/"+PROG_ID, true);
firebaseRef.updateChildren(userMap, ...
_
または、JSONツリーの下位の場所でsetValue()
を呼び出すだけです。
_firebaseRef.child("/" + Constants.FIREBASE_LOCATION_USERS + "/" + mEncodedEmail + "/subscribedTo/"+PROG_ID).setValue(true);
_
どちらの場合も、配列を削除して このようないわゆるインデックスの推奨構造 を優先したことに気付くでしょう。
_"subscribedTo": {
"-KFPi5GjCcGrF-oaHnjr": true
},
_