Firebase SDK может иметь только одного активного пользователя. Поскольку вы работаете над массивом в так называемом узком цикле, я подозреваю, что вы, возможно, создаете следующего пользователя, прежде чем код начнет писать документ для предыдущего пользователя. Чтобы проверить, действительно ли это проблема, вы можете попробовать проверить, исправит ли она это?
Добавить функцию для создания пользователей
void createNextUser(List<String> student_names, List<String> student_numbers, List<String> parent_names) {
if (student_names.size() > 0 && student_numbers.size() > 0 && parent_names.size() > 0) {
final String student_name = student_names.remove(0);
final String student_number = student_numbers.remove(0);
final String parent_name = parent_names.remove(0);
final String username = parent_name.replaceAll(" ", "") + student_number;
final String email = username + "@onurmail.com";
final String password = "123456";
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in user's information
Log.d("User Registered", "createUserWithEmail:success");
final FirebaseUser user = mAuth.getCurrentUser();
final String user_id = user.getUid();
//I get valid userId's for 20 users.
//CREATE STUDENT OBJECT AND FIREBASE INSTANCES
final FirebaseFirestore db = FirebaseFirestore.getInstance();
final Map<String, Object> student = new HashMap<>();
student.put("student_name", student_name);
student.put("parent_name", parent_name);
//My first element of array comes here and prints its parent name and student name perfectly but cant see anything about it on database.
//PUT STUDENT TO THE DB
db.collection("TED_Ankara")
.document(parent_name)
.set(student)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
Toast.makeText(getApplicationContext(), "User inserted sucessfully: "+parent_name,
Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(getApplicationContext(), "User cannot be inserted: "+parent_name,
Toast.LENGTH_SHORT).show();
}
// Now that we're done with this user, move on to the next one
createNextUser(student_names, student_number, parent_names);
}
});
} else {
// If sign in fails, display a message to the user.
Log.w(TAG, "createUserWithEmail:failure", task.getException());
Toast.makeText(getApplicationContext(), "Authentication failed.",
Toast.LENGTH_SHORT).show();
}
}
});
}
}
Большая разница в этом коде состоит в том, что он только начинает создавать следующего пользователя, как только он завершит создание предыдущего пользователя и его документа. Это делает это:
удаление текущего студента из списка при его запуске
final String student_name = student_names.remove(0);
final String student_number = student_numbers.remove(0);
final String parent_name = parent_names.remove(0);
вызывая себя после написания документа
// Now that we're done with this user, move on to the next one
createNextUser(student_names, student_number, parent_names);
Теперь все, что осталось сделать, это запустить процесс в вашем onCreate
с помощью:
createNextUser(Arrays.asList(StudentCreator.student_names), Arrays.asList(StudentCreator.student_numbers), Arrays.asList(StudentCreator.parent_names));
Примечание: создание учетных записей для других пользователей является административным действием, и, как правило, его не следует выполнять с помощью клиента Android. Я настоятельно рекомендую проверить Firebase Admin SDK , который лучше поддерживает такие операции. Он должен использоваться в доверенной среде, а не в приложении Android, например на компьютере разработчика, на сервере, которым вы управляете, или в облачных функциях.