Java Firebase数据库用setValue()覆盖以前的值

Java Firebase数据库用setValue()覆盖以前的值,java,android,json,firebase,firebase-realtime-database,Java,Android,Json,Firebase,Firebase Realtime Database,所以我在Firebase中有一个数据库 此代码位于onCreate()中: 此代码位于另一个名为onClick的方法中: mDatabaseRefUser.child("Chat").child(mAuth.getCurrentUser().getUid()) .child(userID).child(uploadID).child("Messages").push().setValue(new ChatMessage(addMessageEditText.getText

所以我在Firebase中有一个数据库

此代码位于onCreate()中:

此代码位于另一个名为onClick的方法中:

mDatabaseRefUser.child("Chat").child(mAuth.getCurrentUser().getUid())
            .child(userID).child(uploadID).child("Messages").push().setValue(new ChatMessage(addMessageEditText.getText().toString(),
            mAuth.getCurrentUser().getEmail()));

mDatabaseRefUser.child("Chat").child(userID)
            .child(mAuth.getCurrentUser().getUid()).child(uploadID).child("Messages").push().setValue(new ChatMessage(addMessageEditText.getText().toString(),
            userEmail));
我试图做的是在每次调用该方法时添加一个新值,而不删除以前/现有的值

目前,每次单击并启动该方法时,都会删除以前的/现有的值,并添加新的值。但我都不想被删除。我希望这也能增加新的价值。我尝试过使用getRef和push(),但我的数据仍然被覆盖。我做错了什么

这是我第一次调用该方法:

"Users" : {
"Chat" : {
  "Xta3jwm4yLQWaJBypMBFt2esiOr2" : {
    "xfqAFlRpbUZRlZb76svN5FUtbU93" : {
      "-LCvIA_9L1Y9rjkm96Aj" : {
        "Messages" : {
      "-LCvqDidnNqQ8ALZhDud" : {
        "messageText" : "Very good",
        "messageTime" : 1526791230552,
        "messageUser" : "mama@mama.com"
      }
    },
    "chatAgainstUserEmail" : "mama2@mama.com",
    "chatAgainstUserID" : "xfqAFlRpbUZRlZb76svN5FUtbU93",
    "uploadID" : "-LCvIA_9L1Y9rjkm96Aj",
    "userEmail" : "mama@mama.com",
    "userID" : "Xta3jwm4yLQWaJBypMBFt2esiOr2"
  }
}

},
  "xfqAFlRpbUZRlZb76svN5FUtbU93" : {
"Xta3jwm4yLQWaJBypMBFt2esiOr2" : {
  "-LCvIA_9L1Y9rjkm96Aj" : {
    "Messages" : {
      "-LCvqDigI8ZwHDYuPhw9" : {
        "messageText" : "Very good",
        "messageTime" : 1526791230555,
        "messageUser" : "mama2@mama.com"
      }
    },
    "chatAgainstUserEmail" : "mama@mama.com",
    "chatAgainstUserID" : "Xta3jwm4yLQWaJBypMBFt2esiOr2",
    "uploadID" : "-LCvIA_9L1Y9rjkm96Aj",
    "userEmail" : "mama2@mama.com",
    "userID" : "xfqAFlRpbUZRlZb76svN5FUtbU93"
      }
    }
  }
}
这是我第二次调用它时使用的JSON

"Users" : {
"Chat" : {
  "Xta3jwm4yLQWaJBypMBFt2esiOr2" : {
    "xfqAFlRpbUZRlZb76svN5FUtbU93" : {
      "-LCvIA_9L1Y9rjkm96Aj" : {
        "Messages" : {
      "-LCvr0zoHOPxsKOVJzeu" : {
        "messageText" : "Very good 2nd call",
        "messageTime" : 1526791440547,
        "messageUser" : "mama@mama.com"
      }
        },
    "chatAgainstUserEmail" : "mama2@mama.com",
    "chatAgainstUserID" : "xfqAFlRpbUZRlZb76svN5FUtbU93",
    "uploadID" : "-LCvIA_9L1Y9rjkm96Aj",
    "userEmail" : "mama@mama.com",
    "userID" : "Xta3jwm4yLQWaJBypMBFt2esiOr2"
  }
}
  },
  "xfqAFlRpbUZRlZb76svN5FUtbU93" : {
"Xta3jwm4yLQWaJBypMBFt2esiOr2" : {
  "-LCvIA_9L1Y9rjkm96Aj" : {
    "Messages" : {
      "-LCvr0zrh8wQ2WurUezs" : {
        "messageText" : "Very good 2nd call",
        "messageTime" : 1526791440550,
        "messageUser" : "mama2@mama.com"
      }
    },
    "chatAgainstUserEmail" : "mama@mama.com",
    "chatAgainstUserID" : "Xta3jwm4yLQWaJBypMBFt2esiOr2",
    "uploadID" : "-LCvIA_9L1Y9rjkm96Aj",
    "userEmail" : "mama2@mama.com",
    "userID" : "xfqAFlRpbUZRlZb76svN5FUtbU93"
      }
    }
  }
}

我也尝试过使用
getRef().push()
,但也没有成功。我也尝试过不使用。
getRef()
和不使用
。push()
,也不起作用。

要更新值而不是覆盖它,应该使用方法


您之所以覆盖它,是因为Firebase数据库中的每个节点都是一个
映射
,在
映射
的情况下,它会用新值替换旧值。

要更新数据,您应该使用此类代码,而不是使用
child.setValue()
,顾名思义,它将直接用新值替换旧值。但是如果你想改变一个特定的值,那么你应该做如下的事情。试试看,伙计

HashMap<String, Object> params = new HashMap<>();
params.put("yourKey", your value);   
yourDatabaseChildReference.updateChildren(params);
HashMap params=newhashmap();
参数put(“您的键”,即您的值);
yourDatabaseChildReference.updateChildren(参数);

我解决这个问题的唯一办法是建立一个新的数据库

我补充说:

mDatabaseRefUser.child("Chatting").child(mAuth.getCurrentUser().getUid())
                .child(userID).child(uploadID).child("Messages").push().setValue(new ChatMessage(addMessageEditText.getText().toString(),
                mAuth.getCurrentUser().getEmail()));

        mDatabaseRefUser.child("Chatting").child(userID)
                .child(mAuth.getCurrentUser().getUid()).child(uploadID).child("Messages").push().setValue(new ChatMessage(addMessageEditText.getText().toString(),
                userEmail));

并删除了旧的

嘿,如果你认为我的答案有问题,请留下评论。谢谢我也试过了,它仍然会覆盖。这两个json文件之间的区别是什么?区别在于当我添加新值“非常好的第二次调用”时,旧值“非常好”会被删除。还有一个问题。什么是
Xta3jwm4yLQWaJBypMBFt2esiOr2
什么是
xfqAFlRpbUZRlZb76svN5FUtbU93
?使用updateChildren(hasmap),它给了我与添加push()相同的结果
mDatabaseRefUser.child("Chatting").child(mAuth.getCurrentUser().getUid())
                .child(userID).child(uploadID).child("Messages").push().setValue(new ChatMessage(addMessageEditText.getText().toString(),
                mAuth.getCurrentUser().getEmail()));

        mDatabaseRefUser.child("Chatting").child(userID)
                .child(mAuth.getCurrentUser().getUid()).child(uploadID).child("Messages").push().setValue(new ChatMessage(addMessageEditText.getText().toString(),
                userEmail));