You need to enable JavaScript to run this app. 重构现有类逻辑:如何不大幅改代码去除数据库多余questionHash层级
优惠活动
大模型
产品
解决方案
定价
更多

重构现有类逻辑:如何不大幅改代码去除数据库多余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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 16:24:04