使用Flutter的RealTime数据库会覆盖数据,而不是将其添加到现有节点

时间:2020-10-16 07:16:31

标签: json firebase flutter firebase-realtime-database

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

这是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是用户输入的变量。

1 个答案:

答案 0 :(得分:1)

使用push()将数据附加到您的孩子下方。

为了保持理智,您需要删除“ Todo”子项下的当前数据,因为您的数据结构将更改为以下格式:

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

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

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