Firebase 实时数据库 - 将数据添加到现有节点

问题描述 投票:0回答:1

我正在尝试将数据附加到已经存在的节点。如下图所示。

database

我试图使用设置或更新,但我无法获得正确的结果。我尝试使用推送,但我不想添加数据库提供的唯一 ID。

这就是我的代码现在的样子。它有效,但我相信有更好的方法来做到这一点。

  Future<bool> addUserToRoom(String roomCode) async {
    try {
      User? user = firebaseAuth.currentUser;
      DatabaseReference ref = rtdb.ref();

      DataSnapshot snapshot = await ref.child("rooms/$roomCode/users").get();
      if (snapshot.exists) {
        List<Object?> users = snapshot.value as List<Object?>;
        users = users.toList();
        users.add(user!.uid);
        await ref.child("rooms/$roomCode/users/").set(users);
        return true;
      } else {
        return false;
      }
    } catch (e) {
      Get.snackbar("Error while creating account", e.toString());
      return false;
    }
  }
flutter firebase firebase-realtime-database
1个回答
0
投票

除非用户的顺序很重要,否则更好的方法是使用类似地图的数据结构,其中 UID 是键,并将

true
存储为值。在代码中,会是这样的:

ref.child("rooms/$roomCode/users").child(user!.uid).set(true);

这样做的优点:

  • 写入 UID 现在是幂等的,这意味着您不再需要 使用事务 原子地修改
    users
    节点。
  • 根据定义,UID 只能在
    users
    节点中出现一次,即使您犯了编码错误。

另一方面,如果您需要向用户发出订单,并且希望允许重复,则应该使用 Firebase 的内置

push()
操作,而不是使用
List
/数组。有关原因的更多信息,请阅读最佳实践:Firebase 中的数组

© www.soinside.com 2019 - 2024. All rights reserved.