重构现有类逻辑:如何不大幅改代码去除数据库多余questionHash层级
方案1:修改Question类继承结构(改动最小,全兼容现有逻辑)
你现在多出来questionHash层级的核心原因是Firebase序列化时会把Question类下的所有成员变量都当成数据库子节点,你把questionHash的HashMap内嵌在Question类里,自然就多了一层。
只需要把Question类改成直接继承HashMap<String, String>,同时保留原有get/set方法兼容旧逻辑即可,改动如下:
public class Question extends HashMap<String, String> { public Question() { super(); } // 原有方法完全保留,不需要修改上层调用逻辑 public HashMap<String, String> getQuestionHash() { return this; } public void setQuestionHash(HashMap<String, String> questionHash) { this.clear(); this.putAll(questionHash); } }
修改完成后你不需要动其他任何业务代码:原有拉取、展示逻辑完全正常运行,上传时Firebase会直接把Question里的键值对写到对应节点下,不会再生成多余的questionHash层级。
方案2:上传前转换结构(不需要修改类定义)
如果你不想修改原有类的继承结构,可以在上传前做一次轻量结构转换,不需要遍历所有题目内容:
// 先把Quiz对象转成通用Map结构 HashMap<String, Object> uploadData = new HashMap<>(); // 复制其他基础字段 uploadData.put("topicName", quizToBeUploaded.getTopicName()); uploadData.put("description", quizToBeUploaded.getDescription()); // 其他所有基础字段都按上面的方式复制,然后单独处理questions字段 HashMap<String, HashMap<String, String>> questionMap = new HashMap<>(); for (Map.Entry<String, Question> entry : quizToBeUploaded.questions.entrySet()) { questionMap.put(entry.getKey(), entry.getValue().getQuestionHash()); } uploadData.put("questions", questionMap); // 直接上传转换后的Map quizAreaReference.child(uuidAsString).child("main").setValue(uploadData).addOnCompleteListener(new OnCompleteListener<Void>() {
这个方案不需要修改原有实体类定义,也不需要修改拉取展示逻辑,只需要改上传这一处的代码即可。
内容的提问来源于stack exchange,提问作者Jake Dove
相关产品推荐
相关产品推荐

