android - 将 Firebase 数据导入 android 类

标签 android firebase firebase-realtime-database

<分区>

我正在尝试查询 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)     

最佳答案

这是该数据库中其中一种恐龙的 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 对象写回数据库,它将只有heightlength权重 属性。它不会:出现顺序消失。事实上:即使属性确实之前存在于数据库中,写回这个对象也会删除它们。

因此正确的解决方案是将 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;
    }
}

关于android - 将 Firebase 数据导入 android 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34233058/

相关文章:

json - (已解决)(类型 'String' 不是类型 'int' 的子类型)- Flutter

android - 指定的 Firebase 路径超出了可写入的最大深度

Android Vector Asset Studio : Import SVG and use ID as Name

javascript - 具有 PhoneGap + Firebase 身份验证问题的混合应用

ios - 安装 FirebaseInstanceID 时出错

javascript - 如何让 DOM 自动更新 - Firebase 问题

swift2 - 模块 'Firebase' 没有名为 'defaultConfig' 的成员

java - 共享首选项帮助。如何保存 int?

Android: AlarmManager 用来调用一个Service来通知用户

android studio calendar set maxDate 18年前