com.firebase.client.FirebaseException:无法使用类CLASS_NAME android解析节点 [英] com.firebase.client.FirebaseException: Failed to parse node with class class CLASS_NAME android

查看:103
本文介绍了com.firebase.client.FirebaseException:无法使用类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> into updateChildren(), which fits the contract of that API. But I'm pretty sure in some of the values you have a Java object (likely a HashTagModel) 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屋!

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