【问题标题】:Import Firebase data into android class [duplicate]将Firebase数据导入android类[重复]
【发布时间】:2015-12-11 21:45:22
【问题描述】:

我正在尝试从下面的示例链接查询 Firebase 数据并将其存储到 Dinosaur 类中。直接从 Firebase 导入 Dinosaur Facts 类时遇到问题。它能够创建查询并进入“onChildAdded”方法。然后它转到 Dinosaur 构造函数类,但之后立即崩溃。

DinosaurFacts facts = snapshot.getValue(DinosaurFacts.class); //CRASHES HERE

https://www.firebase.com/docs/android/guide/retrieving-data.html

这里是 DinosaurFacts 类

package jobsme.com.firebasequery;

import android.util.Log;

public class DinosaurFacts {
    long height;
    double length;
    long weight;

    public DinosaurFacts() {
        Log.i("MyActivity", "FIIIIIIIIIIIIIIIIIINDMEEEE2");
        // empty default constructor, necessary for Firebase to be able to deserialize blog posts
    }

    public long getHeight() {
        Log.i("MyActivity", "FIIIIIIIIIIIIIIIIIINDMEEEE3");
        return height;
    }

    public double getLength() {
        return length;
    }

    public long getWeight() {
        return weight;
    }

}

这里是 MainAcitivity 中的 onCreate 方法

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Firebase.setAndroidContext(this);

    Firebase ref = new Firebase("https://dinosaur-facts.firebaseio.com/dinosaurs");
    Query queryRef = ref.orderByChild("height");

    queryRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot snapshot, String previousChild) {
            Log.i("MyActivity", "onChildAdded");
            DinosaurFacts facts = snapshot.getValue(DinosaurFacts.class);
            Log.i("MyActivity", snapshot.getKey() + " was " + facts.getHeight() + " meters tall");
        }

        @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) {

        }
        // ....
    });

    Log.i("MyActivity", "FIIIIIIIIIIIIIIIIIINDMEEEE");


}

查询成功,但导入崩溃。希望这意味着我正确设置了一切?

这是日志输出:

12-11 16:48:37.793 5581-5581/jobsme.com.firebasequery E/AndroidRuntime: FATAL EXCEPTION: main
Process: jobsme.com.firebasequery, PID: 5581
com.firebase.client.FirebaseException: Failed to bounce to type
    at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:196)
    at jobsme.com.firebasequery.MainActivity$2.onChildAdded(MainActivity.java:45)
    at com.firebase.client.core.ChildEventRegistration$1.run(ChildEventRegistration.java:50)
    at com.firebase.client.core.view.EventRaiser$1.run(EventRaiser.java:37)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5001)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
    at dalvik.system.NativeStart.main(Native Method)
 Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "vanished" (class jobsme.com.firebasequery.DinosaurFacts), not marked as ignorable (3 known properties: , "weight", "length", "height"])
    at [Source: java.io.StringReader@52851428; line: 1, column: 33] (through reference chain: jobsme.com.firebasequery.DinosaurFacts["vanished"])
    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:192)
    at jobsme.com.firebasequery.MainActivity$2.onChildAdded(MainActivity.java:45) 
    at com.firebase.client.core.ChildEventRegistration$1.run(ChildEventRegistration.java:50) 
    at com.firebase.client.core.view.EventRaiser$1.run(EventRaiser.java:37) 
    at android.os.Handler.handleCallback(Handler.java:733) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5001) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
    at dalvik.system.NativeStart.main(Native Method)     

【问题讨论】:

  • @FrankvanPuffelen 同意。

标签: android firebase firebase-realtime-database


【解决方案1】:

这是该数据库中一只恐龙的 JSON:

"bruhathkayosaurus": {
  "appeared": -70000000,
  "height": 25,
  "length": 44,
  "order": "saurischia",
  "vanished": -70000000,
  "weight": 135000
},

您正在使用的DinosaurFacts 类只有以下属性的字段+getter:heightlengthweight。因此,当 Firebase 尝试将 JSON 反序列化为 DinosaurFacts 对象时,它会抱怨未映射的属性。

消除错误的最简单方法是告诉 Jackson(Firebase 在内部使用它在 JSON 和 Java 之间进行映射)忽略它在 JSON 中遇到的任何未映射的属性:

@JsonIgnoreProperties(ignoreUnknown = true)
public static class DinosaurFacts {

但是要小心这个。如果您现在将DinosaurFacts 对象写入回数据库中,它将只有heightlengthweight 属性。它不会有:appearedordervanished。事实上:即使属性确实之前存在于数据库中,写回这个对象也会删除它们。

所以正确的解决方案是将 JSON 结构中的所有属性映射到 Java 类中:

public static class DinosaurFacts {
    long appeared, vanished;
    double height, length, weight;
    String order;

    public long getAppeared() {
        return appeared;
    }

    public long getVanished() {
        return vanished;
    }

    public double getHeight() {
        return height;
    }

    public double getLength() {
        return length;
    }

    public double getWeight() {
        return weight;
    }

    public String getOrder() {
        return order;
    }
}

【讨论】:

  • 现在可以使用了!我是否在任何地方的文档中错过了这一点?
  • 我不确定。文档明确提到您必须将 JSON 中的每个属性与 Java 中的字段匹配(提示:我写了那部分)。但它没有解释像@JsonIgnoreProperties 这样的技巧。使用我在问题评论中提供的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
  • 2014-08-11
  • 2021-06-21
  • 2016-04-04
  • 1970-01-01
  • 2017-09-22
相关资源
最近更新 更多