【问题标题】:Firebase Database overwrites previous value with setValue()Firebase 数据库使用 setValue() 覆盖以前的值
【发布时间】:2018-05-20 13:45:16
【问题描述】:

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

这段代码在onCreate()中:

DatabaseReference mDatabaseRefUser =FirebaseDatabase.getInstance().getReference("Users");

此代码位于另一个调用 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() 但我的数据仍然被覆盖。我在这里做错了什么?

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

"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(),也没有用。

【问题讨论】:

    标签: java android json firebase firebase-realtime-database


    【解决方案1】:

    要更新值而不是覆盖它,您应该使用updateChildren() 方法。

    您正在覆盖它,因为 Firebase 数据库中的每个节点都是 Map,而对于 Map,它会将旧值替换为新值。

    【讨论】:

    • 嘿downvoter,如果您认为我的回答有问题,请发表评论。谢谢!
    • 我也试过了,它仍然会覆盖。顺便说一句,不是我投反对票
    • 这2个json文件有什么区别?
    • 不同之处在于,当我添加新值“非常好 2nd call”时,旧值“非常好”被删除
    • 我明白了。还有一个问题。什么是Xta3jwm4yLQWaJBypMBFt2esiOr2,什么是xfqAFlRpbUZRlZb76svN5FUtbU93
    【解决方案2】:

    要更新数据,您应该使用此类代码,而不是使用child.setValue(),正如其名称所示,它将直接用新值替换旧值。但是如果你想改变一个特定的值,那么你应该选择如下的东西。试一试吧!

    HashMap<String, Object> params = new HashMap<>();
    params.put("yourKey", your value);   
    yourDatabaseChildReference.updateChildren(params);
    

    【讨论】:

    • 使用 updateChildren(hasmap),它给了我与添加 push() 相同的结果
    【解决方案3】:

    我对这个问题的唯一解决方案是创建一个新数据库,

    我添加了这个:

    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));
    

    并删除旧的

    【讨论】:

      猜你喜欢
      • 2020-06-23
      • 2019-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多