如何从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
相关产品推荐
相关产品推荐

