Firestore:在Android的Hashmap字段中添加元素

时间:2020-09-09 06:33:17

标签: android google-cloud-firestore

在我的社交应用中,我想将所有用户ID添加到我的朋友或家庭成员的“地图字段”中。 因此,当某人接受朋友的请求时,他们文档的请求映射字段都将更新。

这想要这样:

Users:

    ---User1:
    ----requests{
      -----user2:friend
      -----user3:friend
      -----user4:family
           }
    ---User2:
    ----requests{
      -----user1:friend
      -----user3:friend
      -----user4:family
           }

我添加了此代码


final DocumentReference dr4 = db.collection("Users").document(UserID);

            dr4.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                @Override
                public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                    if (task.isSuccessful()){
                        DocumentSnapshot ds = task.getResult();
                        if(ds!=null){
                            Object obj = ds.getData().get("requests");
                            Map<String,Object> setter2 = (HashMap<String, Object>) obj;
                            if(setter2==null){
                                setter2 = new HashMap<>();
                            }
                            Map<String,Object> request = new HashMap<>();
                            request.put(ProfileUserID,"family");
                            setter2.put("requests", request);
                            batch.update(dr4,setter2);

                        }

当第一个用户添加到请求中时,此方法效果很好。但是,当添加第二个用户时,它会像这样被弄乱:

Users:

    ---User1:
    ----user4:family
    ----requests{
      -----user2:friend
             }

曾经是朋友并且在请求内的旧用户现在退出了请求,并成为了自己的新字段,而新朋友进入了请求内。 我在做什么错了?

编辑1 经过一些调整。现在,我可以在请求映射中添加所有用户ID。 但是现在,如果我在地图上有1个条目,然后再添加一个,则较旧的条目会在地图外被复制

The requests field, with both entires

The copy of older entry which is now outside the map and is a separate entry.

此代码为:


db.collection("Users").document(ProfileUserID).get()
.addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if(task.isSuccessful()){
Map<String, Object> abc = (Map<String, Object>)task.getResult().getData().get("requests");
   if (abc==null){
      abc = new HashMap<>();
   }
   Map<String,Object> req = new HashMap<>();
     req.put(UserID,"family");
     abc.put("requests",req);
db.collection("Users").document(ProfileUserID)
.set(abc,SetOptions.merge())
.addOnCompleteListener(new OnCompleteListener<Void>() {
       @Override
     public void onComplete(@NonNull Task<Void> task) {
      if(task.isSuccessful()){
db.collection("Users").document(UserID).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
  @Override
  public void onComplete(@NonNull Task<DocumentSnapshot> task) {
    if(task.isSuccessful()) {
    Map<String, Object> abc2 = (Map<String, Object>)task.getResult().getData().get("requests");
      if (abc2 == null) {
         abc2 = new HashMap<>();
      }
   Map<String, Object> req = new HashMap<>();
   req.put(ProfileUserID, "family");
   abc2.put("requests", req);
db.collection("Users").document(UserID).set(abc2,SetOptions.merge());

2 个答案:

答案 0 :(得分:0)

我认为语句ds.getData().get("requests")返回:{ user4:family }, 并将其分配给setter2

正在使用值request创建{ user2:friend }映射,并使用put方法(即{ request: { user2:friend } })将其添加到上面。这样的创建结构是这样的:

{ user4:family, requests { user2:friend } }

我想这是结构错误的原因。我没有游乐场来测试它,但是我认为这应该起作用:

if(ds!=null){
    Object obj = ds.getData().get("requests");
    
    Map<String,Object> setter2 = new HashMap<>();
    Map<String,Object> request = new HashMap<>();
                        
    request.put((HashMap<String, Object>) obj) 
    request.put(ProfileUserID,"family");
                        
    setter2.put("requests", request);
    batch.update(dr4,setter2);
}

我敢肯定,这只是解决问题的众多方法之一。

答案 1 :(得分:0)

我没有将Map 添加到请求地图字段中,而是将请求更改为名为family的数组,并使用FieldValue.arrayUnion()方法增加了用户ID,如下所示:

db.collection("Users").document(ProfileUserID).update("family",FieldValue.arrayUnion(UserID))