Firebase实时数据库删除旧数据并替换它。

11 浏览
0 Comments

Firebase实时数据库删除旧数据并替换它。

我想要在我的实时数据库中添加新的数据。然而数据库会删除旧数据并写入新数据。我的数据结构如下:\n[图片链接](https://i.stack.imgur.com/FaJhM.png)\n而我想要在rooms/roomid/users/中添加一个新用户。\n我的代码部分:\n

joinRoom = async (callback = f => f, roomId) => {
    currentRoomUid = roomId
    var username = ''
    await database().ref(`/users/${auth().currentUser.uid}`).once('value', function (snap) {
        username = snap.val().username
    })
    const room = database().ref(`/rooms/${roomId}`);
    await room.set({
        isStart: true,
        currentQuestionIndex: 0
    });
    const usersRef = database().ref(`/rooms/${roomId}/users`)
    usersRef.child(auth().currentUser.uid).set({
        username: username,
        skor: 0
    });
    callback(roomId)
}

\n这里重点是添加用户的地方。我使用了set方法。我该如何修复它?我想要添加第二个用户。\n问题:\n旧数据\n[图片链接](https://i.stack.imgur.com/8LSCt.png)\n添加操作后\n[图片链接](https://i.stack.imgur.com/caFMl.jpg)

0
0 Comments

Firebase实时数据库删除旧数据并替换它的问题原因是使用`.set()`方法会删除旧数据并创建新数据,所以在使用`room.set`时会删除房间中的所有内容,包括用户。因此,每次用户进入房间时,都会删除先前的用户并添加自己。解决方法是使用`room.update`方法来更新数据,代码如下:

const room = database().ref(`/rooms/${roomId}`);
await room.update({
    isStart: true,
    currentQuestionIndex: 0
});

如果想更好地了解`set`和`update`之间的区别,请阅读以下问题的答案:[Firebase update vs set](https://stackoverflow.com/questions/38923644)

下面是完整的代码示例:

joinRoom = async (callback = f => f, roomId) => {
    currentRoomUid = roomId
    var username = ''
    await database().ref(`/users/${auth().currentUser.uid}`).once('value', function (snap) {
        username = snap.val().username
    })
    const room = database().ref(`/rooms/${roomId}`);
    await room.update({
        isStart: true,
        currentQuestionIndex: 0
    });
    const usersRef = database().ref(`/rooms/${roomId}/users`)
    usersRef.child(auth().currentUser.uid).set({
        username: username,
        skor: 0
    });
    callback(roomId)
}

感谢您的回答。不过我想在用户部分添加新的数据。我已经编辑了答案,请告诉我是否仍然不是解决方案。非常感谢您的帮助。您的答案是正确的。问题是我首先使用了`set`,导致房间被清空。

0
0 Comments

Firebase实时数据库删除旧数据并替换新数据的原因可能是代码中的一些问题,导致在添加新数据时先删除了旧数据。解决方法是通过正确设置不同的键来区分新旧数据。

在给usersRef.child(auth().currentUser.uid).set(...)方法传递键时,需要确保每个用户使用不同的键。可以将auth().currentUser.uid替换为具有不同键的值,例如usersRef.child('keyX').set(...)

同时,还可以使用update()方法来对多个位置进行同时更新,以提高效率。

根据问题描述的情况,有可能是由于之前代码块的影响导致问题出现。因为之前设置了相同的房间,所以在添加新数据时会完全删除旧数据并重新添加。需要注意避免这种情况的发生。

最后,问题已经解决,感谢大家的帮助。

0