Как добавить данные в массив в Firebase?

у меня есть массив называется subscribedTo в моем узле пользователей. Теперь я хочу добавить некоторые push ID's этого массива всякий раз, когда пользователь подписан.

но push ID заменяются вместо добавления.

как я могу добавить идентификатор push к массиву?

- схемы

"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();
            }
        });

    }

1 ответов


когда вы называете updateChildren() С картой Firebase берет каждый ключ и заменяет объект в этом месте значением с карты.

документация Firebase на updateChildren() говорит об этом:

учитывая один ключевой путь, как 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, ...

или просто позвонить setValue() в нижней части дерева JSON:

firebaseRef.child("/" + Constants.FIREBASE_LOCATION_USERS + "/" + mEncodedEmail + "/subscribedTo/"+PROG_ID).setValue(true);

вы заметите, что в обоих случаях я избавился от вашего массива в пользу рекомендуемая структура для такого так называемого индекса:

"subscribedTo": {
  "-KFPi5GjCcGrF-oaHnjr": true
},