com.firebase.client.FirebaseException:无法使用类CLASS_NAME android解析节点 [英] com.firebase.client.FirebaseException: Failed to parse node with class class CLASS_NAME android
问题描述
使用 updateChildren
方法更新Firebase中的现有值时,出现以下异常。
com.firebase.client.FirebaseException:无法用类类解析节点com.shajeelafzal.quicktasks_app.models.HashTagModel
at com.firebase.client.snapshot.NodeUtilities.NodeFromJSON(NodeUtilities.java:84)
at com.firebase.client.snapshot.NodeUtilities.NodeFromJSON(NodeUtilities.java:12)
at com .firebase.client.utilities.Validation.parseAndValidateUpdate(Validation.java:127)
at com.firebase.client.Firebase.updateChildren(Firebase.java:438)
at com.shajeelafzal.quicktasks_app.fragments .AddEditTaskFragment $ 4.onDataChange(AddEditTaskFragment.java:408)
我的模型如下所示:
public class HashTagModel implements Parcelable {
$ b $ private HashMap< String,Object> timeStampLastUsed;
@Expose
私人字符串名称;
@Expose
private String createByUserEmail;
私人清单< String> tasksKeys;
$ b $ public HashTagModel(){
}
public HashTagModel(HashMap< String,Object> timeStampLastUsed,String name,
String createByUserEmail,ArrayList< String> ; tasksKeys){
this.timeStampLastUsed = timeStampLastUsed;
this.name = name;
this.createByUserEmail = createByUserEmail;
this.tasksKeys = tasksKeys;
$ / code>
我想要更新的JSON对象看起来像这样Firebase:
$ p $ hashTags:{
USER_EMAIL:{
USA:{
createByUserEmail:USER_EMAIL,
name:#USA,
tasksKeys:[-K6mS36uhKthKf1-1pF1],
timeStampLastUsed:{
timestamp:1451514461234
}
}
}
}
我的 onDateChange
方法如下所示:
public void onDataChange(DataSnapshot dataSnapshot){
/ **如果哈希标记不存在,则创建一个新的哈希标记。 * /
if(dataSnapshot.getValue()== null){
HashMap< String,Object> timestampJoined = new HashMap<>();
timestampJoined.put(Constants.FIREBASE_PROPERTY_TIMESTAMP,ServerValue.TIMESTAMP);
ArrayList< String> keysList = new ArrayList< String>();
keysList.add(key);
HashTagModel hashTag = new HashTagModel(timestampJoined,#+ mHashTags.get(finalI),
Utils.decodeEmail(mEncodedEmail),keysList);
finalHashTagLocation.setValue(hashTag);
} else {
HashTagModel hashtaghModel = dataSnapshot.getValue(HashTagModel.class);
hashtaghModel.getTasksKeys()。add(key);
$ b $ * / HashMap用于数据更新* /
HashMap< String,Object> updateUserTaskData = new HashMap<>();
$ b Utils.updateMapForAllWithValue(null,mHashTags.get(finalI),mEncodedEmail,
updateUserTaskData,,hashtaghModel,Constants.FIREBASE_LOCATION_USER_HASH_TAGS);
$ b / **更新哈希标记* /
finalHashTagLocation.updateChildren(updateUserTaskData,new Firebase.CompletionListener(){
@Override
public void onComplete(firebaseError firebaseError,Firebase firebase){
Log.i(,);
}
});
}
getActivity()。finish();
code> setValue()方法, updateChildren()
不会对您的值执行Java到JSON的转换传入。
$ b 您将 HashMap< String,Object>
传递给 updateChildren()
,它符合该API的合约。但是我非常肯定你有一个Java对象的值(可能是 HashTagModel
),而这个值并不直接映射到JSON类型。
但是你可以做的是将POJO转换成一个Map:
Map< String,Object> hashtaghMap = new ObjectMapper()。convertValue(hashtaghModel,Map.class);然后你可以把值的映射到你传入的值中$ c $ $
。
$ p $ c> updateChildren()I am getting following exception while updating an existing value in the Firebase using
updateChildren
method.com.firebase.client.FirebaseException: Failed to parse node with class class com.shajeelafzal.quicktasks_app.models.HashTagModel at com.firebase.client.snapshot.NodeUtilities.NodeFromJSON(NodeUtilities.java:84) at com.firebase.client.snapshot.NodeUtilities.NodeFromJSON(NodeUtilities.java:12) at com.firebase.client.utilities.Validation.parseAndValidateUpdate(Validation.java:127) at com.firebase.client.Firebase.updateChildren(Firebase.java:438) at com.shajeelafzal.quicktasks_app.fragments.AddEditTaskFragment$4.onDataChange(AddEditTaskFragment.java:408)
My model looks like this:
public class HashTagModel implements Parcelable { private HashMap<String, Object> timeStampLastUsed; @Expose private String name; @Expose private String createByUserEmail; private List<String> tasksKeys; public HashTagModel() { } public HashTagModel(HashMap<String, Object> timeStampLastUsed, String name, String createByUserEmail, ArrayList<String> tasksKeys) { this.timeStampLastUsed = timeStampLastUsed; this.name = name; this.createByUserEmail = createByUserEmail; this.tasksKeys = tasksKeys; } }
JSON Object that I want to update looks like this on Firebase:
"hashTags" : { "USER_EMAIL" : { "USA" : { "createByUserEmail" : "USER_EMAIL", "name" : "#USA", "tasksKeys" : [ "-K6mS36uhKthKf1-1pF1" ], "timeStampLastUsed" : { "timestamp" : 1451514461234 } } } }
And my
onDateChange
method looks like this:public void onDataChange(DataSnapshot dataSnapshot) { /** if the hash tag does not exists already then create new one. */ if (dataSnapshot.getValue() == null) { HashMap<String, Object> timestampJoined = new HashMap<>(); timestampJoined.put(Constants.FIREBASE_PROPERTY_TIMESTAMP, ServerValue.TIMESTAMP); ArrayList<String> keysList = new ArrayList<String>(); keysList.add(key); HashTagModel hashTag = new HashTagModel(timestampJoined, "#" + mHashTags.get(finalI), Utils.decodeEmail(mEncodedEmail), keysList); finalHashTagLocation.setValue(hashTag); } else { HashTagModel hashtaghModel = dataSnapshot.getValue(HashTagModel.class); hashtaghModel.getTasksKeys().add(key); /* HashMap for data to update */ HashMap<String, Object> updateUserTaskData = new HashMap<>(); Utils.updateMapForAllWithValue(null, mHashTags.get(finalI), mEncodedEmail, updateUserTaskData, "", hashtaghModel, Constants.FIREBASE_LOCATION_USER_HASH_TAGS); /** update the Hash Tag */ finalHashTagLocation.updateChildren(updateUserTaskData, new Firebase.CompletionListener() { @Override public void onComplete(FirebaseError firebaseError, Firebase firebase) { Log.i("", ""); } }); } getActivity().finish(); }
解决方案Unlike the
setValue()
method,updateChildren()
does not perform a Java-to-JSON conversion on the value(s) you pass in.You're passing a
HashMap<String, Object>
intoupdateChildren()
, which fits the contract of that API. But I'm pretty sure in some of the values you have a Java object (likely aHashTagModel
) that is not directly mapped to a JSON type.But what you can do is convert the POJO into a Map with:
Map<String, Object> hashtaghMap = new ObjectMapper().convertValue(hashtaghModel, Map.class);
Then you can put the map of values into the values that you're passing into
updateChildren()
.这篇关于com.firebase.client.FirebaseException:无法使用类CLASS_NAME android解析节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!