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

