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

如何从Firebase实时数据库获取布尔值所在字段而非布尔值本身?

Firebase实时数据库类型转换错误解决

问题详情

  • 数据库结构:Followers/Course/AGRI节点下存储的是用户ID: 布尔值的键值对(例如user_xxx: true)
  • 需求:获取存储布尔值的字段名(即用户ID),而非布尔值本身
  • 触发的错误:

com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.Boolean to type com.stys.kneckenyapastpapers.model.course_followers

原代码

mDatabase = FirebaseDatabase.getInstance().getReference("Followers").child("Course").child("AGRI");
mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
    @SuppressLint("NotifyDataSetChanged")
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        for (DataSnapshot di : snapshot.getChildren()) {
            course_followers course_followers = di.getValue(course_followers.class);
            follower.add(course_followers);
            if (dataSnapshot.child(user.getId()).exists()) {
                mUSer.add(user);
            }
        }
        Toast.makeText(getContext(), String.valueOf(follower.size()), Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
    }
});

问题原因

AGRI节点下的每个子节点值都是布尔类型,但你试图将其强制转换为自定义的course_followers对象,类型不匹配直接抛出异常。

解决方法

既然需求是获取字段名(用户ID),无需使用模型类转换,直接通过DataSnapshot的getKey()方法提取即可:

修改后的代码

mDatabase = FirebaseDatabase.getInstance().getReference("Followers").child("Course").child("AGRI");
mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
    @SuppressLint("NotifyDataSetChanged")
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        for (DataSnapshot di : snapshot.getChildren()) {
            // 获取存储布尔值的字段名(用户ID)
            String userId = di.getKey();
            // 若需要同时获取布尔值,可添加此行:
            // Boolean isFollowed = di.getValue(Boolean.class);
            
            follower.add(userId); // 若follower是String类型列表,直接添加ID
            // 检查当前用户是否在关注列表中
            if (snapshot.child(user.getId()).exists()) {
                mUSer.add(user);
            }
        }
        Toast.makeText(getContext(), String.valueOf(follower.size()), Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        // 补充错误处理,方便排查问题
        Toast.makeText(getContext(), "数据获取失败: " + error.getMessage(), Toast.LENGTH_SHORT).show();
    }
});

额外提示

如果一定要用course_followers模型类,需要调整数据库结构:将每个用户ID节点改为对象形式,例如user_xxx: { "isFollowed": true },这样才能和模型类的属性映射。但根据你的需求,直接提取键名是最简洁高效的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 02:26:19