2

I am trying to get a specific value from a firebase database that I have already created. I have followed this youtube tutorial and another similar question which is quite related to what I am trying to achieve.

This is how my Firebase Database looks like Database Tree

I am trying to fetch all the individual items like Name, Snippet, Lat, Long from this db.

Here is what I have tried so far. Right now I have only tried to get Name item

In Oncreate Method :

final TextView nametext = (TextView)findViewById(R.id.name);

        Firebase.setAndroidContext(this);
       final Firebase ref = new Firebase("https://fir-with-maps.firebaseio.com/Group 2");

        final List<PlumbersList> listofplumbers = new ArrayList<>();

        ref.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                PlumbersList plumberslist = dataSnapshot.getValue(PlumbersList.class);
                listofplumbers.add(plumberslist);
                String name = plumberslist.Name;
                nametext.setText(name);
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {

            }
        });

    }

PlumberList class

public class PlumbersList {

    String Name;
    String Snippet;
    String Lat;
    String Long;

    public PlumbersList() {
    }

    public PlumbersList(String name, String snippet, String lat, String aLong) {
        Name = name;
        Snippet = snippet;
        Lat = lat;
        Long = aLong;
    }

    public String getName() {
        return Name;
    }

    public String getSnippet() {
        return Snippet;
    }

    public String getLat() {
        return Lat;
    }

    public String getLong() {
        return Long;
    }

The app crashes after a few seconds. Here is what error logcat looks like

09-09 23:41:19.381 1375-1375/digiart.mapwithfirebase E/UncaughtException: com.firebase.client.FirebaseException: Failed to bounce to type
at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:183)
at digiart.mapwithfirebase.checkingfirebase$1.onChildAdded(checkingfirebase.java:36)
at com.firebase.client.core.ChildEventRegistration.fireEvent(ChildEventRegistration.java:48)
at com.firebase.client.core.view.DataEvent.fire(DataEvent.java:45)
at com.firebase.client.core.view.EventRaiser$1.run(EventRaiser.java:38)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:210)
at android.app.ActivityThread.main(ActivityThread.java:5833)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1113)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:879)
Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "Snippet" (class digiart.mapwithfirebase.PlumbersList), not marked as ignorable (0 known properties: ])
at [Source: java.io.StringReader@297f6a4e; line: 1, column: 13] (through reference chain: digiart.mapwithfirebase.PlumbersList["Snippet"])
at com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty(DeserializationContext.java:555)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:708)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1160)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:315)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2888)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2034)
at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:181)
at digiart.mapwithfirebase.checkingfirebase$1.onChildAdded(checkingfirebase.java:36) 
at com.firebase.client.core.ChildEventRegistration.fireEvent(ChildEventRegistration.java:48) 
at com.firebase.client.core.view.DataEvent.fire(DataEvent.java:45) 
at com.firebase.client.core.view.EventRaiser$1.run(EventRaiser.java:38) 
at android.os.Handler.handleCallback(Handler.java:815) 
at android.os.Handler.dispatchMessage(Handler.java:104) 
at android.os.Looper.loop(Looper.java:210) 
at android.app.ActivityThread.main(ActivityThread.java:5833) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1113) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:879) 
    09-09 23:41:19.711 1375-1375/digiart.mapwithfirebase E/AndroidRuntime: FATAL EXCEPTION: main                                                                           Process: digiart.mapwithfirebase, PID: 1375
com.firebase.client.FirebaseException: Failed to bounce to type
at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:183)
at digiart.mapwithfirebase.checkingfirebase$1.onChildAdded(checkingfirebase.java:36)
at com.firebase.client.core.ChildEventRegistration.fireEvent(ChildEventRegistration.java:48)
at com.firebase.client.core.view.DataEvent.fire(DataEvent.java:45)
at com.firebase.client.core.view.EventRaiser$1.run(EventRaiser.java:38)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:210)
at android.app.ActivityThread.main(ActivityThread.java:5833)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1113)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:879)
Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "Snippet" (class digiart.mapwithfirebase.PlumbersList), not marked as ignorable (0 known properties: ])
at [Source: java.io.StringReader@297f6a4e; line: 1, column: 13] (through reference chain: digiart.mapwithfirebase.PlumbersList["Snippet"])
at com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty(DeserializationContext.java:555)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:708)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1160)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:315)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2888)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2034)
at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:181)
at digiart.mapwithfirebase.checkingfirebase$1.onChildAdded(checkingfirebase.java:36) 
at com.firebase.client.core.ChildEventRegistration.fireEvent(ChildEventRegistration.java:48) 
at com.firebase.client.core.view.DataEvent.fire(DataEvent.java:45) 
at com.firebase.client.core.view.EventRaiser$1.run(EventRaiser.java:38) 
at android.os.Handler.handleCallback(Handler.java:815) 
at android.os.Handler.dispatchMessage(Handler.java:104) 
at android.os.Looper.loop(Looper.java:210) 
at android.app.ActivityThread.main(ActivityThread.java:5833) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1113) 
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:879) 

I am new in android coding so I might be making some very silly mistake here.

Pragnesh Ghoda シ
  • 8,318
  • 3
  • 25
  • 40
U.Ahsan
  • 55
  • 1
  • 10
  • Not sure if it is a typing error, but why are the parameters in ```PlumbersList``` in capital letters. Also, avoid using "Long" as an object name as there is a "Long" class too. Try "Lng" instead. – tingyik90 Sep 09 '17 at 19:16
  • If your just getting started with the app, consider [upgrading to the new Firebase SDK](https://firebase.google.com/support/guides/firebase-android). The tutorial is for the legacy SDK. – Bob Snyder Sep 09 '17 at 19:20
  • I'm asking this because when you cast your JSON to an object, Firebase is mapping those variables via the names and the ```get``` method. For example, if the variable name is ```String lat```, then it will find the ```getLat``` method. Read the doc here: https://firebase.google.com/docs/reference/android/com/google/firebase/database/DataSnapshot.html#getValue(java.lang.Class) or visit here: https://stackoverflow.com/questions/30933328/how-to-convert-firebase-data-to-java-object – tingyik90 Sep 09 '17 at 19:49
  • @tingyik90 Thanks. I'll try it out – U.Ahsan Sep 10 '17 at 12:52
  • @tingyik90 Thank you ! This link https://stackoverflow.com/questions/30933328/how-to-convert-firebase-data-to-java-object worked for me. – U.Ahsan Sep 10 '17 at 14:04

2 Answers2

1

As per your data tree, you are reading from "Group 2" i.e. you are downloading everything under "Group 2" including the "1". What are you trying to achieve here is the main problem. Will there be data "2", "3", "4" and so on? Are those information required to be retrieved?

NO, I only intened to read information from "1" - Based on you setting the textview to a single name, I assume you only need the first item. Hence, you should use a addValueEventListener instead, and directly read from https://fir-with-maps.firebaseio.com/Group 2/1

// add child "1"
ref.child("1").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(final DataSnapshot dataSnapshot) {
        PlumbersList plumberslist = dataSnapshot.getValue(PlumbersList.class);
    }
});

YES, I need everything under "Group 2" - Then you just need to go one level deeper.

ref.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        DataSnapshot childSnapshot = dataSnapshot.getValue();  // get the values of "1"
        PlumbersList plumberslist = childSnapshot.getValue(PlumbersList.class);
        listofplumbers.add(plumberslist);
        String name = plumberslist.Name;
        nametext.setText(name);
    }
});
tingyik90
  • 1,641
  • 14
  • 23
1

Suggestion/Question(?) Why is the object called PlumbersList? it looks more like a single Plumber object.

Getting every plumber in node "group 2" (1,2,3....n), your need to iterate over all the child at that node

ArrayList<Plumber> mPlumbersList = new ArrayList<>();

ref = FirebaseDatabase.getInstance().getReference().child("group 2"); 

ref.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
          for (DataSnapshot data : dataSnapshot.getChildren())
          {
              Plumber plumber = data.getValue(Plumber.class);
              mPlumbersList.add(plumber); 
          } 

          // Notify the adapter after the foreach loop ends, if this list is backing one
          mAdapter.notifyDataSetChanged();

    }
...
});
Andrew Lam
  • 1,371
  • 17
  • 35