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' 用于排序
我是 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' 用于排序