将Firebase数据导入到android类中 [英] Import Firebase data into android class

查看:393
本文介绍了将Firebase数据导入到android类中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图从下面的示例链接查询Firebase数据并将其存储到恐龙类中。从Firebase直接导入恐龙事实课程时,我遇到了一个问题。它能够创建查询并输入onChildAdded方法。它然后去恐龙的构造函数类,但之后崩溃。

$ p $ DinosaurFacts facts = snapshot.getValue(DinosaurFacts.class); //在此触发

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



这里是DinosaurFacts类



  package jobsme.com.firebasequery; 

导入android.util.Log;

公开课DinosaurFacts {
long height;
双倍长度;
长的重量;

public DinosaurFacts(){
Log.i(MyActivity,FIIIIIIIIIIIIIIIIIINDMEEEE2);
//空的默认构造函数,Firebase必须能够反序列化博客文章
}
$ b public long getHeight(){
Log.i(MyActivity ,FIIIIIIIIIIIIIIIIIINDMEEEE3);
返回高度;
}

public double getLength(){
return length;
}

public long getWeight(){
return weight;

code $

$ b $ p

这里是MainAcitivity中的onCreate方法
$ b $ $ p $ $ $ $ $ $保护无效的onCreate Bundle savedInstanceState {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Firebase.setAndroidContext(this);

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

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

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



@Override
public void onChildRemoved(DataSnapshot dataSnapshot){

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


$ b @Override
public void onCancelled(FirebaseError firebaseError){


// ...
});

Log.i(MyActivity,FIIIIIIIIIIIIIIIIIINDMEEEE);






$ b

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

以下是日志输出:



  12-11 16:48 :37.793 5581-5581 / jobsme.com.firebasequery E / AndroidRuntime:FATAL EXCEPTION:main 
进程:jobsme.com.firebasequery,PID:5581
com.firebase.client.FirebaseException:无法跳转到请输入
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 )
在android.app.ActivityThread.main(ActivityThread.java:5001)
在java.lang.reflect.Method.invokeNative(本地方法)$ b $在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)
引起:com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段消失(类jobsme.com.firebasequery.DinosaurFacts) ,未标记为可忽略(3个已知属性:,weight,length,height])
at [Source:java.io.StringReader@52851428; line:1,column:33](通过引用链:jobsme.com.firebasequery.DinosaurFacts [消失])
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.onC hildAdded(MainActivity.java:45)
在com.firebase.client.core.ChildEventRegistration $ 1.run(ChildEventRegistration.java:50)
在com.firebase.client.core.view.EventRaiser $ 1。运行(EventRaiser.java:37)
在android.os.Handler.handleCallback(Handler.java:733)
在android.os.Handler.dispatchMessage(Handler.java:95)
在android.os.Looper.loop(Looper.java:136)
在android.app.ActivityThread.main(ActivityThread.java:5001)
在java.lang.reflect.Method.invokeNative(Native方法)
在java.lang.reflect.Method.invoke(Method.java:515)
在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:

 bruhat hkayosaurus:{
出现:-70000000,
height:25,
length:44,
order:saurischia,
消失:-70000000,
体重:135000
},



<你只用的 DinosaurFacts 类有这些属性的字段+ getters: height 长度重量。所以,当Firebase尝试将JSON反序列化为 DinosaurFacts 对象时,它会抱怨未映射的属性。



通过告诉Jackson(Firebase在内部使用JSON和Java之间的映射)来忽略在JSON中遇到的任何未映射的属性,最简单的方法就是告诉Jackson:

<$ p $ b $ @JsonIgnoreProperties(ignoreUnknown = true)
public static class DinosaurFacts {

小心这个。如果您现在将 DinosaurFacts 对象写回到数据库中,它将只有 height 长度权重属性。它不会有:出现订单消失。事实上,即使属性存在于数据库之前,写回这个对象将会删除它们。

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

  public static class DinosaurFacts {
long出现,消失;
双倍身高,体重,体重;
字符串顺序;

public long getAppeared(){
return出现;


public long getVanished(){
return return vanished;
}

public double getHeight(){
return height;
}

public double getLength(){
return length;
}

public double getWeight(){
return weight;
}

public String getOrder(){
return order;
}
}


I'm trying to Query Firebase data and store it into the Dinosaur class from the example link below. I have an issue when importing directly from Firebase into the Dinosaur Facts class. It's able to create the Query and enters the "onChildAdded" method. It then goes to the Dinosaur constructor class but crashes right after that.

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

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

Here is DinosaurFacts class

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

}

Here is the onCreate method in the MainAcitivity

@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");


}

The query is successful but the importing crashes. Hopefully that means I setup everything correctly?

Here's the log output:

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)     

解决方案

This is the JSON for one of the dinosaurs in that database:

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

The DinosaurFacts class you're using only has fields+getters for these properties: height, length, weight. So when the Firebase tries to deserialize the JSON into a DinosaurFacts object, it complains about the unmapped properties.

The simplest way to get rid of the error is by telling Jackson (which Firebase uses internally to map between JSON and Java) to ignore any unmapped properties it encounters in the JSON:

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

But be careful with this. If you now write a DinosaurFacts object back into the database, it will only have height, length and weight properties. It will not have: appeared, order or vanished. In fact: even if the properties did exist in the database before, writing this object back will delete them.

So the proper solution is to map all the properties from the JSON structure into the Java class:

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

这篇关于将Firebase数据导入到android类中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆