【问题标题】:Saving data from Firebase into a list将 Firebase 中的数据保存到列表中
【发布时间】:2016-05-04 19:55:45
【问题描述】:

我目前正在开发一款用于存储图书翻译的 Android 应用。我正在使用 Firebase 在线保存所有数据,并且可以轻松地从中提取数据并将它们存储为 Book 对象。我在主类中有一个主列表,其中存储了 Firebase 数据库中的所有书籍,但是该列表似乎没有正确更新。

public static List<Book> books = new ArrayList<Book>();

protected void onCreate(Bundle savedInstanceState) {
    myFirebaseRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            for (DataSnapshot bookSnapshhot : snapshot.getChildren()) {
                Book book = bookSnapshhot.getValue(Book.class);
                books.add(book);
                System.out.println(book.getAuthor() + " - " + book.getTitle());
                for (Chapter chapter : book.getChapters()) {
                    System.out.println(chapter.getTitle());
                }
                for (Genre genre : book.getGenres()) {
                    System.out.println(genre.getGenre());
                }
                System.out.println(books.size());
            }
        }
        @Override public void onCancelled(FirebaseError error) { }
    });
    System.out.println(books.size());
}

在那个正文中,书籍的大小是正确的(现在只有 1)。但是,如果我在该代码主体(最后一行)之外调用相同的打印语句,它会给我 0。我不知道为什么,因为它成功地将它添加到 onDataChange() 方法中,但它似乎没有应用更改在外面。

【问题讨论】:

  • Shadab 的回答解释了这一点:您现在无法返回尚未加载的内容。您可能还想在这里阅读我的答案:stackoverflow.com/questions/33203379/…。它使用了更多的词来解释它(尽管在不同的上下文中:写入数据)。

标签: android firebase firebase-realtime-database


【解决方案1】:

我认为您的问题与 ValueEventListener 的异步有关。

onDataChange 被异步调用。

你必须在 onDataChange 被调用后使用书籍。

【讨论】:

    【解决方案2】:

    addValueEventListener() 将异步从Firebase 获取数据。 您的代码描述的是您添加ValueEventListener,然后打印System.out.println(books.size());。这意味着您的日志会在您添加 ValueEventListener 后显示(这并不意味着您的侦听器会被调用)。此时您的侦听器还没有被调用,onDataChange() 也没有。因此,您永远不会在侦听器范围之外获得更新的计数。

    【讨论】:

    • 有趣。我怎样才能确定 onDataChange() 何时被调用?
    • onDataChange() 将在每次myFirebaseRef 下的子节点发生更改时被调用。
    猜你喜欢
    • 2018-07-07
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    相关资源
    最近更新 更多