You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Firebase Realtime Database获取name字段值失败,求解决方案

解决Firebase Realtime Database获取用户name字段的问题

我明白你的困扰了!你现在的代码把数据库里的用户**节点键(key)**加到了列表中,但你真正需要的是每个键对应的name字段值,这样点击列表项时才能拿到正确的name来创建聊天ID。

问题根源

看你的doOnSuccess方法,你只是遍历了数据库的顶层键,直接把键添加到了arrayList,并没有解析每个键下的用户对象,自然拿不到name字段。从你的数据库结构截图来看,每个用户节点下都包含name、username等属性,所以我们需要在遍历过程中取出这些属性。

修改方案

我们需要调整代码,在遍历用户键的时候,解析对应的用户JSON对象,提取name字段,同时保留必要的映射关系(如果后续需要用到用户key的话)。

步骤1:添加映射集合(可选但实用)

首先在类里添加一个HashMap,用来存储用户名(name)和节点键的对应关系,方便后续需要用到key的场景:

private HashMap<String, String> userKeyMap = new HashMap<>(); // 存储name -> 用户节点key

步骤2:修改doOnSuccess方法

修改遍历逻辑,解析每个用户节点的name字段:

public void doOnSuccess(String response) {
    try {
        JSONObject object = new JSONObject(response);
        Iterator<String> iterator = object.keys(); // 指定泛型String让代码更规范
        
        while(iterator.hasNext()) {
            String userKey = iterator.next();
            // 获取当前用户节点的完整JSON对象
            JSONObject userObject = object.getJSONObject(userKey);
            String userName = userObject.getString("name");
            String userUsername = userObject.getString("username");
            
            // 排除当前登录用户
            if(!userUsername.equals(UserDetails.username)) {
                arrayList.add(userName); // 将name添加到列表,这样列表显示的是用户名称
                userKeyMap.put(userName, userKey); // 保存name和key的对应关系
            }
            totalUsers++;
        }
    } catch (JSONException e) {
        Log.e(TAG, "解析用户数据失败", e);
        // 可以在这里添加异常处理,比如提示用户加载失败
    }
    checkIfThereIsAnUser(totalUsers);
}

步骤3:调整列表点击事件

现在点击列表项时,就能直接拿到name字段值了:

usersList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        String selectedUserName = arrayList.get(position);
        UserDetails.chatWith = selectedUserName; // 这里存的就是你需要的name字段
        
        // 如果后续聊天需要用到用户节点的key,可以从映射中获取:
        // String selectedUserKey = userKeyMap.get(selectedUserName);
        
        startActivity(new Intent(getContext(), Chat.class));
    }
});

额外建议

  • 为了避免因某个用户节点缺少name字段导致崩溃,可以在提取前先判断字段是否存在:
    if(userObject.has("name")) {
        String userName = userObject.getString("name");
        // 后续逻辑...
    }
    
  • 考虑使用自定义User类来封装用户信息,这样代码会更清晰易维护。

内容的提问来源于stack exchange,提问作者user6246272

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:54:52