【问题标题】:Read a Specific Value from Firebase Database in android从 Android 中的 Firebase 数据库中读取特定值
【发布时间】:2018-02-18 10:09:07
【问题描述】:

我正在尝试从我已经创建的 firebase 数据库中获取特定值。我关注了这个youtube tutorial 和另一个similar question,这与我想要实现的目标非常相关。

这就是我的 Firebase 数据库的样子 Database Tree

我正在尝试从此数据库中获取所有单个项目,例如名称、片段、纬度、长。

这是我迄今为止尝试过的。现在我只尝试获取 Name 项目

在 Oncreate 方法中:

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 类

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

应用在几秒钟后崩溃。这是错误 logcat 的样子

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) 

我是 android 编码的新手,所以我可能会在这里犯一些非常愚蠢的错误。

【问题讨论】:

标签: android firebase firebase-realtime-database


【解决方案1】:

Suggestion/Question(?) 为什么这个对象叫 PlumbersList?它看起来更像是一个 Plumber 对象。

获取节点“组 2”(1,2,3....n) 中的每个管道工,您需要遍历该节点的所有子节点

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

    }
...
});

【讨论】:

    【解决方案2】:

    根据您的数据树,您正在从“第 2 组”读取数据,即您正在下载“第 2 组”下的所有内容,包括“1”。你想在这里实现什么是主要问题。会有数据“2”、“3”、“4”等吗?是否需要检索这些信息?

    不,我只是想从“1”中读取信息 - 基于您将 textview 设置为单个名称,我假设您只需要第一项。因此,您应该改用addValueEventListener,并直接从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);
        }
    });
    

    是的,我需要“第 2 组”下的所有内容 - 然后你只需要更深一层。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-04
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多