Android Studio中Firestore如何在课程集合内嵌套添加学生、教师子集合
解决方案
核心问题说明
- 你的代码中多次链式调用
.document()方法,每次调用都会生成一个带随机ID的全新文档引用,导致子集合无法挂靠到同一个课程父文档下 - 现有代码存在笔误:你定义的课程名称变量是
txt_lesson,空值判断时误用了不存在的txt_ders变量,会直接导致运行报错
实现逻辑
你需要先完成课程主文档的写入,拿到该文档的固定引用后,再基于这个引用创建下属的两个子集合即可。Firestore 不支持创建空集合,如果仅需要占位子集合结构,写入一个占位文档即可,修正后代码如下:
private void Ders_EKLE(){ binding.btnEkleDers.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { txt_lesson = binding.isimDers.getText().toString(); // 空值校验,修正原笔误txt_ders为txt_lesson if(txt_lesson.equals("")){ AlertDialog.Builder builder = new AlertDialog.Builder(DersEkleActivity.this); builder.setTitle("警告"); builder.setMessage("课程名称不能为空"); builder.setIcon(R.drawable.warningicon); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { } }); builder.show(); } else { linkedHashMap.put("lesson"+i,txt_lesson); // 构造课程基础数据 Map<String, Object> lessonData = new HashMap<>(); lessonData.put("lessonName", txt_lesson); // 1. 先写入课程主文档,拿到该文档的固定引用 Courses.document("KDXnJKKno1D2xtG9G6UE").collection("Lessons") .add(lessonData) .addOnSuccessListener(new OnSuccessListener<DocumentReference>() { @Override public void onSuccess(@NonNull DocumentReference lessonDocRef) { // 2. 基于同一个课程文档引用,分别创建下属Student、Teacher子集合 lessonDocRef.collection("Student") .add(new DersEklePerson()) .addOnSuccessListener(new OnSuccessListener<DocumentReference>() { @Override public void onSuccess(@NonNull DocumentReference documentReference) { // Student子集合写入成功后写入Teacher子集合 lessonDocRef.collection("Teacher") .add(new DersEklePerson()) // 替换为教师类对应的实例对象即可 .addOnSuccessListener(new OnSuccessListener<DocumentReference>() { @Override public void onSuccess(@NonNull DocumentReference documentReference) { Toast.makeText(DersEkleActivity.this,"课程添加成功",Toast.LENGTH_LONG).show(); } }); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Toast.makeText(DersEkleActivity.this,"学生集合添加失败:" + e.getMessage(),Toast.LENGTH_LONG).show(); } }); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Toast.makeText(DersEkleActivity.this,"课程主文档添加失败:" + e.getMessage(),Toast.LENGTH_LONG).show(); } }); } } }); }
内容的提问来源于stack exchange,提问作者partizal
相关产品推荐
相关产品推荐

