com.firebase.client.FirebaseException:未能分析类名称为android的节点
使用com.firebase.client.FirebaseException:未能分析类名称为android的节点,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,使用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.jav
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;
}
}
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();
}
我的onDateChange
方法如下所示:
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;
}
}
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();
}
public void onDataChange(DataSnapshot DataSnapshot){
/**如果哈希标记不存在,则创建一个新的哈希标记*/
if(dataSnapshot.getValue()==null){
HashMap timestampJoined=新的HashMap();
timestampJoined.put(Constants.FIREBASE\u PROPERTY\u TIMESTAMP,ServerValue.TIMESTAMP);
ArrayList keysList=新建ArrayList();
keysList.add(key);
HashTagModel hashTag=新的HashTagModel(timestagJoined,“#”+mHashTags.get(finalI),
Utils.decodemail(mEncodedEmail),键列表;
finalHashTagLocation.setValue(hashTag);
}否则{
HashTagModel hashtaghModel=dataSnapshot.getValue(HashTagModel.class);
hashtaghModel.getTasksKeys().add(key);
/*要更新的数据的HashMap*/
HashMap updateUserTaskData=新HashMap();
Utils.updateMapForAllWithValue(null,mHashTags.get(finalI),mEncodedEmail,
updateUserTaskData“”,hashtaghModel,Constants.FIREBASE\u LOCATION\u USER\u HASH\u TAGS);
/**更新哈希标记*/
finalHashTagLocation.updateChildren(updateUserTaskData,新Firebase.CompletionListener()){
@凌驾
未完成的公共void(FirebaseError FirebaseError,Firebase Firebase){
Log.i(“,”);
}
});
}
getActivity().finish();
}
与setValue()
方法不同,updateChildren()
不会对传入的值执行Java到JSON的转换。
您正在将一个HashMap
传递到updateChildren()
,这符合该API的约定。但我很确定在某些值中有一个Java对象(可能是HashTagModel
),它没有直接映射到JSON类型
但您可以通过以下方式将POJO转换为地图:
Map<String, Object> hashtaghMap = new ObjectMapper().convertValue(hashtaghModel, Map.class);
Map hashtaghMap=new ObjectMapper().convertValue(hashtaghModel,Map.class);
然后,您可以将值映射放入传递到
updateChildren()
的值中。请包含Firebase数据库中的实际JSON文本。您可以通过单击Firebase仪表板中的导出按钮获得它,它将允许我们复制/粘贴JSON以进行测试(或将其粘贴到答案中)。@FrankvanPuffelen i添加了JSON文本。谢谢。我们还缺少写入Firebase的代码(在onDataChange()
中)。是否真的需要HashTagModel
类(它需要这么大)来重现问题?@FrankvanPuffelen我可以删除可打包的代码。我想我可以帮助理解。我正在添加应该更新的代码。我很确定您受到了与此处所述相同的问题的影响:。不能将Java类传递到updateChildren()
中。我对这个问题的回答有一个解决办法。谢谢@FrankvanPuffelen@FrankvanPuffelen既然FirebaseDatabase不再使用jackson,那该怎么办?我们是否应该将其作为依赖项导入以实现相同的结果?我宁愿不这样做,因为从我读到的内容来看,它被移除的原因之一是担心最终的apk大小。(参考)如果您发现我们新的序列化/反序列化无法满足您的需求,您可以使用Jackson。请参阅以了解如何做到这一点。别忘了让我们知道你的用例,这样我们就可以考虑增加对它的支持。我的用例与这个答案完全相同:使用updateChildren而不需要手动将pojo转换为映射。您建议使用ObjectMapper,但它是一个Jackson类,所以我想知道我们是否可以使用FirebaseDatabase API实现相同的结果。我错过什么了吗?(请原谅我的无知,为什么updateChidren不像setValue那样允许POJO?如果有一个相应的方法可以允许POJO,我会请求支持:)@FrankvanPuffelen我也支持@Ena上面的问题。是否有任何方法可以使用updateChildren
,而无需手动将对象转换为地图?