如何将数据追加到Firebase中的数组?

我在我的用户节点中有一个名为subscribedTo数组。 现在我想追加一些push ID's到该数组,每当用户订阅。

push ID正在被replace,而不是被追加。

我怎样才能将推送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(); } }); } 

Solutions Collecting From Web of "如何将数据追加到Firebase中的数组?"

当您使用地图调用updateChildren()时,Firebase将获取每个键并将该位置的对象replace为地图中的值。

updateChildren()上的Firebase文档说明了这一点:

给定像alanisawesome这样的单个关键path, updateChildren()只更新第一个子级别的数据,任何超出第一个子级别的数据都被视为setValue()操作。

所以在你的情况下,你正在replace"/" + 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 },