Firebase不会从字符串值中实例化类型的值 [英] Firebase an not instantiate value of type from String value

查看:179
本文介绍了Firebase不会从字符串值中实例化类型的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

引起:com.fasterxml.jackson.databind.JsonMappingException:无法从字符串值实例化[simple type,class net.we4x4.we4x4.userInformation]类型的值;没有单个字符串的构造函数/工厂方法

这个错误让我感到困惑,我试着按照firebase Docs上提供的几个指令,比如这个:



另一个用于查询数据,另一个教程在这里:
https://www.simplifiedcoding.net/firebase-android-tutorial-writing-firebase-data/



我无法以正确的方式解决问题,简单地说,我正在尝试从这个JASON获取数据:



pre $ $ b $ data $$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ,
users:{
3c42f867-8c3a-423b-89e8-3fb777ab76f8:{
email:k@k.com,
username :kkk
},
5 0347968-cedb-4648-8025-f737fea8d4c9:{
email:a@a.com,
username:aaa
}
} $通过childEventListner的singleValueEventListner,我仍然是一样的错误,我创建了一个b




$ b

单独的crass处理从firebase中提取信息:

pre code public class userInformation {
private String email;
私人字符串用户名;

public userInformation(){

}

public userInformation(String username){
this.username = username;
}

public String getEmail(){
return email;
}

public void setEmail(String email){
this.email = email;
}

public String getUsername(){
return username;


public void setUsername(String username){
this.username = username;

code










$ b $ p


$ b

这是令人困惑的部分,正如在firebase社区的好ppl所建议的那样,我不需要一个setter,但是当我不在这个类中放置一个setter时,我得到这个错误,而且我只是避免得到这个错误只有提取单个字符串的类的构造,当我添加更多的字符串,我仍然得到错误,所以当我添加:

  public userInformation(String username,String email){
this.username = username;
this.email = email;
}

我得到错误,在下面的堆栈跟踪?



我的主要方法是:

pre $ public breadData(){
Firebase ref = new Firebase(https://wi4x4.firebaseio.com/users/+ UserID);
ref.addValueEventListener(新ValueEventListener(){
@覆盖
公共无效onDataChange(DataSnapshot dataSnapshot){
为(DataSnapshot执行PostSnapshot:dataSnapshot.getChildren()){
userInformation userInformation = postSnapshot.getValue(userInformation.class);
String username = userInformation.getUsername();
String email = userInformation.getEmail();
usernameDisplay.setText(email);


$ b @Override
public void onCancelled(FirebaseError firebaseError){
firebaseError.getMessage();
}
});





与addChildEventListner相同的错误;

  public void readingData(){
Firebase ref = new Firebase(https://wi4x4.firebaseio.com/users/+ UserID );
Query queryRef = ref.orderByChild(email);
queryRef.addChildEventListener(new ChildEventListener(){
@Override
public void onChildAdded(DataSnapshot dataSnapshot,String email){
// Map< String,Objects> extractedEmail =(Map< ; String,Objects>)dataSnapshot.getValue();
userInformation userInformation = dataSnapshot.getValue(userInformation.class);
email = userInformation.getEmail();
usernameDisplay.setText(email) ;
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot,String previousChild){
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot){

@Override
public void onChildMoved(DataSnapshot dataSnapshot,String previousChild){
}
@Override $ b $ public void onCancelled(FirebaseError firebaseError){
Toast.makeText(getApplicat ionContext(),
读取失败:+ firebaseError.getMessage(),
Toast.LENGTH_LONG).show();
}
});



$ b

我为长文章道歉,但是我想提供更多信息为了得到一些帮助,理解这里的困惑。

  03-26 07:30:42.654 8560-8560 / net.we4x4 .we4x4 E / AndroidRuntime:FATAL EXCEPTION:main 
进程:net.we4x4.we4x4,PID:8560
com.firebase.client.FirebaseException:无法在com.firebase中输入
.client.DataSnapshot.getValue(DataSnapshot.java:183)维持在com.firebase.client.core.ValueEventRegistration net.we4x4.we4x4.MainActivity $ 2.onDataChange(MainActivity.java:112)

。 fireEvent(ValueEventRegistration.java:45)
在com.firebase.client.core.view.DataEvent.fire(DataEvent.java:45)
在com.firebase.client.core.view.EventRaiser $ 1 .run(EventRaiser.java:38)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
在android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5584)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method。 (com.android.internal.os.ZygoteInit)$(Method.java:515)
ZygoteInit.java:1084)
在dalvik.system.NativeStart.main(本地方法)
引起:com.fasterxml.jackson.databind.JsonMappingException:无法实例化类型的值[simple type,class net.we4x4.we4x4.userInformation] from String value;无单String构造/工厂方法
。在com.fasterxml.jackson.databind.deser.std.StdValueInstantiator._createFromStringFallbacks(StdValueInstantiator.java:428)
。在com.fasterxml.jackson.databind.deser。 std.StdValueInstantiator.createFromString(StdValueInstantiator.java:299)
处com.fasterxml.jackson.databind com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1056)
。 deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:136)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:123)
at com.fasterxml.jackson.databind。 ObjectMapper._readMapAndClose(ObjectMapper.java:2888)
在com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2034)
在com.firebase.client.DataSnapshot.getValue(DataSnapshot。 java:181)
at net.we4x4.we4x4.MainActivity $ 2.onDataChange(MainActivity.java:112)
at com.firebase.client.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:45)
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:733)
at android.os.Handler。 dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5584)
(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:1268)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
at dalvik.system.NativeStart.main(Native Method)


解决方案

您正在阅读单个用户对象没有孩子:

  public void readingData(){
Firebase ref = new Firebase(https:/ /wi4x4.firebaseio.com/users/+ UserID);
ref.addValueEventListener(新ValueEventListener(){
@覆盖
公共无效onDataChange(DataSnapshot dataSnapshot){
为(DataSnapshot执行PostSnapshot:dataSnapshot.getChildren()){
userInformation userInformation = postSnapshot.getValue(userInformation.class);
String username = userInformation.getUsername();
String email = userInformation.getEmail();
usernameDisplay.setText(email);



$ b $ p
$ b

这样for循环会遍历子属性 email username 。这些不能被反序列化为 userInformation


$ b $ p $




$ b code> public void readingData(){
Firebase ref = new Firebase(https://wi4x4.firebaseio.com/users/+ UserID);
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot){
userInformation userInformation = dataSnapshot.getValue(userInformation.class);
字符串用户名= userInformation.getUsername();
String email = userInformation.getEmail();
usernameDisplay.setText(email);
}


Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class net.we4x4.we4x4.userInformation] from String value; no single-String constructor/factory method

This error is confusing me, i've tried to follow several instructions provided on the firebase Docs, such as this one : https://www.firebase.com/docs/android/guide/retrieving-data.html

and another one on querying data, also another tutorial here : https://www.simplifiedcoding.net/firebase-android-tutorial-writing-firebase-data/

and i was not able to solve the problem, in a proper way, simply what i am trying to do is get the data from this JASON :

  {
 "data" : {
"ratingPic" : 0,
"ratingVClip" : 36
 },
"users" : {
"3c42f867-8c3a-423b-89e8-3fb777ab76f8" : {
  "email" : "k@k.com",
  "username" : "kkk"
},
"50347968-cedb-4648-8025-f737fea8d4c9" : {
  "email" : "a@a.com",
  "username" : "aaa"
  }
 }
}

By a singleValueEventListner of childEventListner, i still the same error, i've created a seperate crass to deal with extracting the information from firebase :

public class userInformation {
private String email;
private String username;

public userInformation(){

}

public userInformation(String username){
    this.username = username;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

}

And this is the confusing part, as was suggested by the good ppl on firebase community, that i do not need a setter, but when i dont put a setter in this class i get the error, and i only avoided getting the error with this construct of the class which only extract a single string, and when i add more strings i still get the error, so when i add:

    public userInformation(String username,  String email){
    this.username = username;
    this.email = email;
}

i get the error, in the below stack trace ?

my main method is :

     public void readingData() {
    Firebase ref = new Firebase("https://wi4x4.firebaseio.com/users/" + UserID);
    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot postSnapshot: dataSnapshot.getChildren()){
                userInformation userInformation = postSnapshot.getValue(userInformation.class);
                String username = userInformation.getUsername();
                String email = userInformation.getEmail();
                usernameDisplay.setText(email);
            }
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            firebaseError.getMessage();
        }
    });
}

*** The same Error accrue with addChildEventListner;

     public void readingData(){
    Firebase ref = new Firebase("https://wi4x4.firebaseio.com/users/" + UserID);
    Query queryRef = ref.orderByChild("email");
    queryRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String email) {
            // Map<String, Objects> extractedEmail = (Map<String, Objects>) dataSnapshot.getValue();
            userInformation userInformation = dataSnapshot.getValue(userInformation.class);
            email = userInformation.getEmail();
            usernameDisplay.setText(email);
        }
        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String previousChild) {
        }
        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
        }
        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String previousChild) {
        }
        @Override
        public void onCancelled(FirebaseError firebaseError) {
            Toast.makeText(getApplicationContext(),
                    "The read failed: " + firebaseError.getMessage(),
                    Toast.LENGTH_LONG).show();
        }
    });
} 

I apologize for the long post, but i am trying to provide as much info in order to get some help understand the confusion here .

03-26 07:30:42.654 8560-8560/net.we4x4.we4x4 E/AndroidRuntime: FATAL EXCEPTION: main
  Process: net.we4x4.we4x4, PID: 8560
  com.firebase.client.FirebaseException: Failed to bounce to type
     at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:183)
     at net.we4x4.we4x4.MainActivity$2.onDataChange(MainActivity.java:112)
     at com.firebase.client.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:45)
     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:733)
     at android.os.Handler.dispatchMessage(Handler.java:95)
     at android.os.Looper.loop(Looper.java:136)
     at android.app.ActivityThread.main(ActivityThread.java:5584)
     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:1268)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
     at dalvik.system.NativeStart.main(Native Method)
  Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class net.we4x4.we4x4.userInformation] from String value; no single-String constructor/factory method
     at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator._createFromStringFallbacks(StdValueInstantiator.java:428)
     at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:299)
     at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1056)
     at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:136)
     at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:123)
     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 net.we4x4.we4x4.MainActivity$2.onDataChange(MainActivity.java:112) 
     at com.firebase.client.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:45) 
     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:733) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5584) 
     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:1268) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 
     at dalvik.system.NativeStart.main(Native Method) 

解决方案

You're reading a single user object, so it doesn't have children:

public void readingData() {
  Firebase ref = new Firebase("https://wi4x4.firebaseio.com/users/" + UserID);
  ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot postSnapshot: dataSnapshot.getChildren()){
            userInformation userInformation = postSnapshot.getValue(userInformation.class);
            String username = userInformation.getUsername();
            String email = userInformation.getEmail();
            usernameDisplay.setText(email);
        }

So that for loop will iterator over the child properties of the user, email and username. Those cannot be deserialized into a userInformation object.

The solution is simply to not loop:

public void readingData() {
  Firebase ref = new Firebase("https://wi4x4.firebaseio.com/users/" + UserID);
  ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        userInformation userInformation = dataSnapshot.getValue(userInformation.class);
        String username = userInformation.getUsername();
        String email = userInformation.getEmail();
        usernameDisplay.setText(email);
    }

这篇关于Firebase不会从字符串值中实例化类型的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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