web-dev-qa-db-ja.com

Firebaseのアレイにデータを追加する方法は?

ユーザーノードに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();
            }
        });

    }
9
user3467240

マップで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
},
_
9