com.firebase.client.FirebaseException:无法使用Class class CLASS_NAME android解析节点

使用updateChildren方法更新Firebase中的现有值时,我会收到以下异常.
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)

我的模型看起来像这样:

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对象在Firebase上如下所示:

"hashTags" : {
    "USER_EMAIL" : {
      "USA" : {
        "createByUserEmail" : "USER_EMAIL","name" : "#USA","tasksKeys" : [ "-K6mS36uhKthKf1-1pF1" ],"timeStampLastUsed" : {
          "timestamp" : 1451514461234
        }
      }
    }
  }

而我的onDateChange方法如下所示:

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();
}

解决方法

与setValue()方法不同,updateChildren()不会对您传入的值执行Java到JSON的转换.

您正在传递一个HashMap< String,Object>进入updateChildren(),它符合该API的合同.但是我确实在某些值中有一个不直接映射到JSON类型的Java对象(可能是HashTagModel).

但是您可以做的是将POJO转换为地图:

Map<String,Object> hashtaghMap = new ObjectMapper().convertValue(hashtaghModel,Map.class);

然后,您可以将值映射到您要传入updateChildren()的值.

相关文章

Android 如何解决dialog弹出时无法捕捉Activity的back事件 在...
Android实现自定义带文字和图片的Button 在Android开发中经常...
Android 关于长按back键退出应用程序的实现最近在做一个Andr...
android自带的时间选择器只能精确到分,但是对于某些应用要求...