Flutter:child.ref.remove 和 children.length 计数不正确

Flutter: child.ref.remove and children.length not counting properly

我是 Flutter 的新手,我有一个应用程序,我想在其中删除书籍并将其添加到我的 Firebase 实时数据库中。

问题是当我尝试通过点击一个图标来删除一本书时,这本书确实从 Firebase 中删除了,但是,当我 运行 一些代码进一步向下时,我需要其中的数量心愿单上的书数,总是比实际数多 1。

这是我删除所选图书的代码:

// Which means the book was in the wishlist already, so we have to remove it
if (isBookWishb) {
  for (DataSnapshot element in userTable.children) {
    if (element.key == widget.userID) {
        if (element.child("BOOKS_WISH").exists) {
          for (int i = 0; i < element.child("BOOKS_WISH").children.length; i++) {
            if (element.child("BOOKS_WISH").child(i.toString()).value.toString() == widget.book.bookID) {
              element.child("BOOKS_WISH").child(i.toString()).ref.remove();
              break;
            }
          }
        }
        isBookWishb = false;
      break;
    }
  }
}

这就是我检索某个用户拥有的图书数量的方式(例如,在同一个 for 循环中)

element.child("BOOKS_WISH").children.length

这是我的数据库

当我删除“2131313”时,它仍然正确计算数量,当我将其添加回去时也是如此。当我尝试删除“56”或“6”时出现问题。如果我删除其中一个,我删除后的数量仍然显示为 3,而它应该是 2,所以当我再次将这本书添加到数据库时,它变为 4 而不是 3

我试过 .set(null) ,花了几秒钟时间确保我没有将 firebase 进程与我的打印重叠,但似乎没有任何效果。 因为这件小事,我的整个项目都毁了,而且我似乎无法修复它。在此先感谢您的关注

那是一个 Firebase 数组!

数组通常很难在 NoSQL 数据库(尤其是实时数据库)中使用;您不能插入或删除单个元素,因为数组被视为一个对象,并且索引永远不会改变;例如值 2131313 在索引 2 处 'stuck'。

如果你想更新一个数组,它必须被读取,在代码中修改并且re-written。

看这篇经典博客Arrays Are Evil

一个更好的选择是用它自己的 firebase 生成的密钥来存储每本书。然后你可以很容易地 add/edit 或删除。

所以它看起来像这样

BOOKS_WISH
   -Y0kmos9j9h8fg: "56"
   -Y0joa90i90skl: "6"
   -Y0ziklklakldd: "2131313"

其中 -Y0kmos9j9h8fg 等是 firebase 生成的密钥

该结构还提供了更多的灵活性!

BOOKS_WISH
   -Y0kmos9j9h8fg:
       bookNum: "56"
       bookTitle: "Some title"
   -Y0joa90i90skl:
       bookNum: "6"
       bookTitle: "Another title"
   -Y0ziklklakldd:
       bookNum: "2131313"
       bookTitle: "Yet another title"

现在您可以对您的图书列表进行查询、排序等操作。您甚至可以添加另一个节点 'sort_index' 用于排序