Skip to content Skip to sidebar Skip to footer

Android Firebase Retrieve Data From Child Node

I'm trying to get the data from Firebase child node. But it throws Can't convert object of type java.lang.String to type uk.co.stableweb.geethika.model.DailyVerse exception. This i

Solution 1:

Pay careful attention to the names of your properties in the JSON and your fields/getters in the Java code. If they don't match, the Firebase client won't be able to match the values between them.

Your JSON has verse_title and verse_content, so your Java class must be either:

publicclassDailyVerse{
    publicString verse_title;
    publicString verse_content;    
}

or:

publicclassDailyVerse {

    privateString verse_title;
    privateString verse_content;

    publicStringgetVerse_title() {
        return verse_title;
    }

    publicvoidsetVerse_title(String verse_title) {
        this.verse_title = verse_title;
    }

    publicStringgetVerse_content() {
        return verse_content;
    }

    publicvoidsetVerse_content(String verse_content) {
        this.verse_content = verse_content;
    }
}

Since Firebase Android SDK 9.2, you can also annotate your Java code to map to the correct JSON properties. So a third way to get the correct mapping is:

publicclassDailyVerse {

    privateString verse_title;
    privateString verse_content;

    @PropertyName("verse_title")
    publicStringgetVerseTitle() {
        return verse_title;
    }

    publicvoidsetVerseTitle(String verse_title) {
        this.verse_title = verse_title;
    }

    @PropertyName("verse_content")
    publicStringgetVerseContent() {
        return verse_content;
    }

    publicvoidsetVerseContent(String verse_content) {
        this.verse_content = verse_content;
    }
}

I haven't tried that latest variant though, so let me know if there are typos on the answer.

Solution 2:

By this method

mRef.addChildEventListener(childEventListener);

you subscribe for

.child("daily_verse");

children. daily_verse has two children: verse_content and verse_title. The type of these children is String. So, you get two String datasnapshot in the onChildAdd listener.

Update: Try something like this:

mRef = FirebaseDatabase.getInstance().getReference();
mRef.keepSynced(true);

ChildEventListener childEventListener = newChildEventListener() {
    @OverridepublicvoidonChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
        Log.d("Child Event,Verse", dataSnapshot.getKey());
        if ("daily_verse".equal(dataSnapshot().getKey){
            dailyVerse = dataSnapshot.getValue(DailyVerse.class);
            Log.d("TEST","Object: "+dailyVerse);
            if (dailyVerse!=null){
               Log.d("TEST","values: "+dailyVerse.verse_title+", "+dailyVerse.verse_content);
            }
        }

    }

    @OverridepublicvoidonChildChanged(DataSnapshot dataSnapshot, String previousChildName) {
        Log.d("Child Event,Verse", "onChildChanged:" + dataSnapshot.getKey());
        if ("daily_verse".equal(dataSnapshot().getKey){
          dailyVerse = dataSnapshot.getValue(DailyVerse.class);
          Log.d("TEST","Changed object: "+dailyVerse);
          if (dailyVerse!=null){
             Log.d("TEST","Changed values: "+dailyVerse.verse_title+", "+dailyVerse.verse_content);
          }
        }
    }

    @OverridepublicvoidonChildRemoved(DataSnapshot dataSnapshot) {

    }

    @OverridepublicvoidonChildMoved(DataSnapshot dataSnapshot, String previousChildName) {

    }

    @OverridepublicvoidonCancelled(DatabaseError databaseError) {
        Log.w("Firebase", "onCancelled", databaseError.toException());
        Toast.makeText(context, "Failed to load verse",
                Toast.LENGTH_SHORT).show();
    }
};

mRef.addChildEventListener(childEventListener);

You should subscribe to events from parent object and check the key at events listener.

Solution 3:

DataRef = FirebaseDatabase.getInstance().getReference().child("Users");

DataRef.addValueEventListener(newValueEventListener() {
            @OverridepublicvoidonDataChange(DataSnapshot dataSnapshot) {
                String acctname = (String)dataSnapshot.child("Name").getValue();
                String acctmail = (String)dataSnapshot.child("Email").getValue();

            }

            @OverridepublicvoidonCancelled(DatabaseError databaseError) {

            }
});

Solution 4:

When using a firebase model class, You have to include an empty constructor for firebase to work with.

Try adding it as

publicclassDailyVerse {
    publicDailyVerse(){

    }
}

Solution 5:

ArrayList<EventsResponse> usersEventsList = new ArrayList<>();
    dummyIdsArrayList = new ArrayList<>();
    Iterator<DataSnapshot> eventsIterator = dataSnapshot.getChildren().iterator();
    while (eventsIterator.hasNext()) {
        DataSnapshot eventsSnapShot = eventsIterator.next();
        EventsResponse eventsResponse = new EventsResponse();
        eventsResponse.setEventName(eventsSnapShot.getKey());
        Iterator<DataSnapshot> eventChildIterator = eventsSnapShot.getChildren().iterator();
        while (eventChildIterator.hasNext()) {
            DataSnapshot eventchildSnapshot = eventChildIterator.next();
            if (eventchildSnapshot.getKey().equals("is_recursive")) {
                eventsResponse.setRecursive((Boolean) eventchildSnapshot.getValue());
            } elseif (eventchildSnapshot.getKey().equals("is_notif")) {
                eventsResponse.setNotif((Boolean) eventchildSnapshot.getValue());
            } elseif (eventchildSnapshot.getKey().equals("is_editable")) {
                eventsResponse.setEditable((Boolean) eventchildSnapshot.getValue());
            } elseif (eventchildSnapshot.getKey().equals("is_visible")) {
                eventsResponse.setVisible((Boolean) eventchildSnapshot.getValue());
            } elseif (eventchildSnapshot.getKey().equals("name")) {
                eventsResponse.setName(eventchildSnapshot.getValue().toString());
            } elseif (eventchildSnapshot.getKey().equals("date")) {
                Iterator<DataSnapshot> eventChildDateIterator = eventchildSnapshot.getChildren().iterator();
                while (eventChildDateIterator.hasNext()) {
                    DataSnapshot eventchildDateSnapshot = eventChildDateIterator.next();
                    if (eventchildDateSnapshot.getKey().equals("day")) {
                        eventsResponse.setDay(eventchildDateSnapshot.getValue().toString());
                    } elseif (eventchildDateSnapshot.getKey().equals("month")) {
                        eventsResponse.setMonth(eventchildDateSnapshot.getValue().toString());
                    } elseif (eventchildDateSnapshot.getKey().equals("year")) {
                        eventsResponse.setYear(eventchildDateSnapshot.getValue().toString());
                    }
                }
            } else {
                eventsResponse.setNotif(true);
                eventsResponse.setVisible(false);
            }
        }

if you are not able to fetch data,then you can fetch the data in that format.

Post a Comment for "Android Firebase Retrieve Data From Child Node"