我正在尝试将数据附加到已经存在的节点。如下图所示。
我试图使用设置或更新,但我无法获得正确的结果。我尝试使用推送,但我不想添加数据库提供的唯一 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;
}
}
除非用户的顺序很重要,否则更好的方法是使用类似地图的数据结构,其中 UID 是键,并将
true
存储为值。在代码中,会是这样的:
ref.child("rooms/$roomCode/users").child(user!.uid).set(true);
这样做的优点:
users
节点。users
节点中出现一次,即使您犯了编码错误。另一方面,如果您需要向用户发出订单,并且希望允许重复,则应该使用 Firebase 的内置
push()
操作,而不是使用 List
/数组。有关原因的更多信息,请阅读最佳实践:Firebase 中的数组。