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

Android Java:向Base Adapter传字符串及按教师ID查询Firebase数据

问题2:显示Firebase中与当前登录教师ID匹配的条目

首先先完善你获取当前教师ID的逻辑(从你给出的代码片段来看,应该是存在SharedPreferences里),先确保能正确拿到ID:

// 从SharedPreferences读取当前教师ID
SharedPreferences prefs = getSharedPreferences("AttendancePrefs", Context.MODE_PRIVATE);
String currentTeacherId = prefs.getString("logged_in_teacher_id", null); // 替换成你存储时用的key

// 如果没拿到ID,说明用户未登录,跳转到登录页
if (currentTeacherId == null) {
    startActivity(new Intent(this, LoginActivity.class));
    finish();
    return;
}

接下来,用Firebase Realtime Database的查询功能,筛选出teacherId字段等于currentTeacherId的条目。假设你的Firebase数据结构是这样的:

attendance_records
  |- record_001
      |- teacherId: "TEA_001"
      |- studentName: "张三"
      |- date: "2024-05-20"
  |- record_002
      |- teacherId: "TEA_002"
      |- ...

对应的查询和数据监听代码如下:

// 获取Firebase数据库引用
DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference("attendance_records");

// 构建查询:按teacherId字段筛选,只返回和当前教师ID匹配的条目
Query matchingRecordsQuery = dbRef.orderByChild("teacherId").equalTo(currentTeacherId);

// 添加实时数据监听(如果只需要一次性加载,用addListenerForSingleValueEvent即可)
matchingRecordsQuery.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        List<AttendanceRecord> recordList = new ArrayList<>();
        // 遍历查询到的所有数据快照
        for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
            // 将快照转换为实体类对象(你需要创建对应的AttendanceRecord类)
            AttendanceRecord record = snapshot.getValue(AttendanceRecord.class);
            if (record != null) {
                recordList.add(record);
            }
        }

        // 初始化Adapter,把查询到的列表传进去(如果需要把教师ID也传给Adapter,参考问题1的构造方法传参)
        AttendanceRecordAdapter adapter = new AttendanceRecordAdapter(MainActivity.this, recordList);
        yourListView.setAdapter(adapter);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        // 处理查询失败的情况,比如弹出提示
        new AlertDialog.Builder(MainActivity.this)
                .setTitle("加载失败")
                .setMessage("无法获取数据:" + databaseError.getMessage())
                .setPositiveButton("确定", null)
                .show();
    }
});

注意事项:

  • 确保你的Firebase数据库规则允许读取这些数据,比如可以设置规则只允许教师读取自己的记录:
    {
      "rules": {
        "attendance_records": {
          ".read": "auth != null && data.child('teacherId').val() === auth.uid",
          ".write": "auth != null && data.child('teacherId').val() === auth.uid"
        }
      }
    }
    
  • 你的AttendanceRecord实体类字段要和Firebase中的字段名一致,或者用@PropertyName注解做映射
  • 如果不需要实时监听数据变化,用addListenerForSingleValueEvent替代addValueEventListener可以减少资源消耗

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:21:33