Firebase不会从字符串值中实例化类型的值 [英] Firebase an not instantiate value of type from String value
问题描述
这个错误让我感到困惑,我试着按照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屋!