Ed Wu
Ed Wu

Reputation: 117

Saving data from Firebase into a list

I'm currently developing an Android app that deals with storing book translations. I'm using Firebase to hold all the data online, and I have no trouble pulling data from it and storing them as Book objects. I have a master list of books in the main class that stores all the books from the Firebase database, however the list doesn't seem to update properly.

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());
}

In that body, the size of books is correct (right now it is only 1). However if I call the same print statement outside of that code body (the last line), it gives me 0. I don't know why, because it successfully adds it inside the onDataChange() method but it seems to not apply the changes on the outside.

Upvotes: 0

Views: 506

Answers (2)

Shadab Ansari
Shadab Ansari

Reputation: 7070

The addValueEventListener() will fetch the data from Firebase asynchronously. What your code depicts is that you are adding ValueEventListener and then printing System.out.println(books.size());. This means your logs gets displayed after you add ValueEventListener(which doesn't means your listener gets invoked). At this point your listener is not invoked yet and so isn't onDataChange(). Thus you won't ever get updated count outside the listener scope.

Upvotes: 2

spassador
spassador

Reputation: 413

I think that your problem is about the asyncronously of the ValueEventListener.

The onDataChange is called asynconously.

You have to use the books after the onDataChange is called.

Upvotes: 2

Related Questions