将Firebase数据导入到android类中 [英] Import Firebase data into android class
问题描述
我试图从下面的示例链接查询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屋!