Авторизованный пользователь-администратор читает данные факультета из файла .xls и загружает их в firestore. При загрузке данных факультета я хочу создать для каждого факультета в качестве авторизованного пользователя свои данные под своим идентификатором. например, если я загружаю этот файл faculty.xls , я хочу создать 5 пользователей и сохранить данные их профиля под своим идентификатором в базе данных firestore. когда я пытаюсь создать пользователя с электронной почтой и паролем, система не останавливается для сохранения данных для этого соответствующего uid, и выполняется дальнейший код. Как заставить систему ждать, пока firestore создаст пользователя и сохранит данные в соответствующем uid, а затем go, чтобы прочитать следующую запись. первый пользователь , второй пользователь . Моя проблема в том, что я загружаю 5 записей аутентификации, пользователи генерировали 4 данных. В базе данных только 2 пользователя аутентификации хранили данные, но оба пользователя хранили одни и те же данные. Как ее решить.
package com.example.eklavya.ui.adminadduserfaculty;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProviders;
import com.example.eklavya.R;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.nbsp.materialfilepicker.MaterialFilePicker;
import com.nbsp.materialfilepicker.ui.FilePickerActivity;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import static android.app.Activity.RESULT_OK;
public class AdminAddUserFacultyFragment extends Fragment implements
AdapterView.OnItemSelectedListener{
private static final String TAG = "main";
Workbook workbook = null;
XSSFWorkbook wBook;
Sheet sheet=null; //sheet can be used as common for XSSF and HSSF WorkBook
FirebaseFirestore fStore;
FirebaseAuth fAuth;
Button uploadtbtn, choosefiletbtn;
TextView pathtview;
String selecteddept,selectedclass,userid,facid,userdept;
String facname,facemail,facsubject1,facsubject2,facsubject3;
private AdminAddUserFacultyViewModel mViewModel;
public static AdminAddUserFacultyFragment newInstance() {
return new AdminAddUserFacultyFragment();
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.admin_add_user_faculty_fragment, container, false);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mViewModel = ViewModelProviders.of(this).get(AdminAddUserFacultyViewModel.class);
// TODO: Use the ViewModel
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
uploadtbtn = view.findViewById(R.id.btnaaufupload);
choosefiletbtn = view.findViewById(R.id.btnaaufchoosefile);
pathtview = view.findViewById(R.id.txtaauffilepath);
fStore= FirebaseFirestore.getInstance();
fAuth= FirebaseAuth.getInstance();
Здесь я получаю текущий административный отдел в переменной userdept
//get current user department
userid=fAuth.getCurrentUser().getUid();
fStore.collection("Admin").document(userid).get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
userdept= documentSnapshot.getString("Department");
}
});
Здесь я выбираю файл .xls из мобильного хранилища
choosefiletbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new MaterialFilePicker()
.withSupportFragment(AdminAddUserFacultyFragment.this)
.withRequestCode(1)
.withHiddenFiles(true) // Show hidden files and folders
.start();
}
});
}
Здесь я читаю данные файла .xls
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1 && resultCode == RESULT_OK) {
assert data != null;
String filePath = data.getStringExtra(FilePickerActivity.RESULT_FILE_PATH);
// Do anything with file
pathtview.setText(filePath);
//Read Excel to File
uploadtbtn.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onClick(View view) {
try {
//Create the input stream from the xlsx/xls file
FileInputStream fis = new FileInputStream(filePath);
//Create Workbook instance for xlsx/xls file input stream
Workbook workbook = null;
if(filePath.toLowerCase().endsWith("xlsx")){
workbook = new XSSFWorkbook(fis);
}else if(filePath.toLowerCase().endsWith("xls")){
workbook = new HSSFWorkbook(fis);
}
//Get the number of sheets in the xlsx file
//loop through each of the sheets
//Get the nth sheet from the workbook
Sheet sheet = workbook.getSheetAt(0);
//every sheet has rows, iterate over them
Iterator<Row> rowIterator = sheet.iterator();
int rowno =0;
// viewtext.append("\n");
while (rowIterator.hasNext()) {
Log.e(TAG, " row no "+ rowno );
Row myRow = (Row) rowIterator.next();
if(rowno !=0) {
Iterator<Cell> cellIter = myRow.cellIterator();
int colno =0;
facname=null;facemail=null;facsubject1=null;facsubject2=null;facsubject3=null;
while (cellIter.hasNext()) {
Cell myCell = (Cell) cellIter.next();
if (colno==0){
facemail = myCell.toString();
}else if (colno==1){
facname = myCell.toString();
}else if (colno==2){
facsubject1 = myCell.toString();
}else if (colno==3){
facsubject2 = myCell.toString();
}else if (colno==4){
facsubject3 = myCell.toString();
}
colno++;
Log.e(TAG, " Index :" + myCell.getColumnIndex() + " -- " + myCell.toString());
}
Это код, который я использовал для создания нового идентификатора пользователя факультета и сохранения данных его профиля в созданном идентификаторе пользователя. в аутентификации
fAuth.createUserWithEmailAndPassword(facemail,"123456789").addOnSuccessListener(new OnSuccessListener<AuthResult>() {
@Override
public void onSuccess(AuthResult authResult) {
facid = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("Faculty").document(facid);
Map<String, Object> FacData = new HashMap<>();
// StudData.put("Roll No",srollno);
FacData.put("Name", facname);
FacData.put("Email ID", facemail);
FacData.put("Department", userdept);
FacData.put("Subject", Arrays.asList(facsubject1, facsubject2, facsubject3));
documentReference.set(FacData).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Toast.makeText(getContext(), "File Uploaded successfully ", Toast.LENGTH_SHORT).show();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(getContext(), "File not uploaded", Toast.LENGTH_SHORT).show();
}
});
Toast.makeText(getContext(), "Auth successful", Toast.LENGTH_SHORT).show();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(getContext(), "Auth failed", Toast.LENGTH_SHORT).show();
}
});}
rowno++;
}
//close file input stream
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}}