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

如何从Firebase实时数据库读取用户选中课程数据到Android Studio?

问题排查与修复方案

核心问题:数据库路径错误

你提供的数据库结构显示根目录直接是用户ID节点(如userId1、userId2),但代码中额外添加了不存在的"users"节点路径:

DatabaseReference userSelectedCoursesRef = FirebaseDatabase.getInstance()
        .getReference("users").child(userId) // 此处多了"users"节点,与实际结构不符
        .child("selectedCourses");

这会导致Firebase尝试读取/users/userId/selectedCourses,而实际数据存储在/userId/selectedCourses,自然无法获取到课程信息。

修复步骤

1. 修正数据库路径

调整代码中的路径,直接从根节点指向用户的selectedCourses:

private void populateSpinner2(String userId) {
    Log.d("Firebase", "Fetching selected courses for user: " + userId);
    DatabaseReference userSelectedCoursesRef = FirebaseDatabase.getInstance()
            .getReference() // 直接从根节点开始
            .child(userId)
            .child("selectedCourses");

    userSelectedCoursesRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            List<String> selectedCourses = new ArrayList<>();

            // 打印快照状态,辅助调试
            Log.d("Firebase", "Snapshot exists: " + dataSnapshot.exists());
            Log.d("Firebase", "Course count: " + dataSnapshot.getChildrenCount());

            for (DataSnapshot courseSnapshot : dataSnapshot.getChildren()) {
                // 安全判断选中状态,避免空指针
                Boolean isSelected = courseSnapshot.getValue(Boolean.class);
                if (Boolean.TRUE.equals(isSelected)) {
                    selectedCourses.add(courseSnapshot.getKey());
                }
            }

            populateSpinner2WithCourses(selectedCourses);
            Log.d("Firebase", "Fetched courses: " + selectedCourses.toString());
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Toast.makeText(GRADE.this, "Failed to fetch selected courses: " + databaseError.getMessage(), Toast.LENGTH_SHORT).show();
            Log.e("Firebase", "Fetch error: ", databaseError.toException());
        }
    });
}

2. 检查数据库权限规则

确保Firebase实时数据库权限允许当前用户读取自己的节点。示例规则(仅允许用户读写自身数据):

{
  "rules": {
    "$userId": {
      ".read": "$userId === auth.uid",
      ".write": "$userId === auth.uid"
    }
  }
}

测试阶段可临时开放全权限(上线前务必关闭):

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

3. 调试验证

查看Logcat的Firebase标签日志,确认:

  • Snapshot exists是否为true
  • Course count是否大于0
  • Fetched courses是否输出预期的课程ID列表

额外注意事项

  • 确认传入populateSpinner2的userId与数据库中的用户ID完全一致(大小写敏感)
  • 避免空指针:使用Boolean.TRUE.equals(isSelected)代替直接if(isSelected),防止getValue(Boolean.class)返回null时崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:21:31