带有 Flutter 的实时数据库覆盖数据而不是将其添加到现有节点

Posted

技术标签:

【中文标题】带有 Flutter 的实时数据库覆盖数据而不是将其添加到现有节点【英文标题】:RealTime Database with Flutter overwrites data instead of adding it to the existing nodes 【发布时间】:2021-01-30 16:55:15 【问题描述】:

我正在使用 Flutter 和 Firebase 实时数据库。如代码所示,每个用户都可以创建自己的列表并向其中添加任务。但是,每次我尝试将新任务添加到同一个列表时,它都会覆盖现有数据而不是附加到它。谁能帮帮我。

这是 ToDo 模型

class Todo 
  String group;
  String subject;
  bool completed;
  String userId;

  Todo(this.userId, this.group, this.subject, this.completed);

  Todo.fromSnapshot(DataSnapshot snapshot)
      : group = snapshot.value["group"],
        userId = snapshot.value["userId"],
        subject = snapshot.value["subject"],
        completed = snapshot.value["completed"];

  toJson() 
    return 
      userId: 
        "lists": [
          
            "groupname": group,
            "tasks": [
              "name": subject, "done": completed,
            ]
          ,
        ]
      
    ;
  

这是要添加到数据库的函数

addNewTodo(String groupn, String taskn) 
    if (groupn.length > 0 && taskn.length > 0) 
      Todo todo =
          new Todo(widget.userId, groupn.toString(), taskn.toString(), false);
      _database.reference().child("Todo").set(todo.toJson());
    
  

groupn & taskn 是用户输入的变量。

【问题讨论】:

你好。 set(),顾名思义,将孩子的值设置为您指定的值,如果孩子已经存在,这本质上是一个更新。 【参考方案1】:

使用push() 在您的孩子下附加数据。

您需要删除“Todo”子项下的当前数据,因为您的数据结构会更改为这种格式:

Todo
  |-> "UniqueID1"
  |     |-> Todo Details (JSON)
  |
  |-> "UniqueID2"
  |     |-> Todo Details (JSON)
  |
  |-> ...

UniqueIDX 是 Firebase 每次您 push() 或添加 Todo 时生成的字母数字字符串。

您可以使用onChildAdded 来监听数据。

【讨论】:

如果回答对您有帮助,请标记为已接受,谢谢!

以上是关于带有 Flutter 的实时数据库覆盖数据而不是将其添加到现有节点的主要内容,如果未能解决你的问题,请参考以下文章

在 Flutter 中将数据保存到 Firebase 实时数据库

带有一个适用于android、ios、web的插件的flutter firebase(实时)数据库? [复制]

实时获取当前登录用户的数据 - Flutter & Firestore

从 REST API 实时更新 Flutter 应用数据

如何检查 Firebase 实时数据库(Dart/Flutter)中是不是存在值?

Flutter - 对带有模型的图表使用 API