Почему я не могу записать первые и последние записи в массиве в Firestore - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь зарегистрировать 20 пользователей и создать документ в своей коллекции для каждого из них в Firebase Firestore. Моя программа успешно регистрирует 20 пользователей, но не удается создать документы для них. 18, 19 документов создаются каждый раз, но почти всегда пропускается создание документа для первого члена и последнего члена моего массива. StudentCreator - это просто файл, который имеет родительский массив, массив студентов с 20 элементами. Вот массив из studentCreator.java

public static String parent_names[]={ "Ahmet Lola", "Hüseyin Kutlutürk", "Ümit Uğrak", "Veysel Karani", "Serkan Gotar", "Dündar Zalim", "Kadir Berkay", "Uğur Özdemir", "Bünyamin Akgün", "Kaptan Price", "Selim Tekiner", "Gökçe Yılan", "Talip Özkan", "Abdurrahman Tarikçi", "Selim Kirlier", "Hasan Can Doğan", "Erdem Gökşen", "Fatoş Ünal", "Nurgül Birtek", "Yuan Hui"};

Вот основной код:

    public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private FirebaseAuth mAuth;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final Intent LoginActivity = new Intent(this,LoginActivity.class);
    final Intent TeacherActivity = new Intent(this,TeacherActivity.class);
    final Intent ParentActivity = new Intent(this,ParentActivity.class);
    final Intent ManagerActivity = new Intent(this,ManagerActivity.class);


    for (int i = 0; i < 20; i++)
    {
        mAuth = FirebaseAuth.getInstance();
        final String username = StudentCreator.parent_names[i].replaceAll(" ", "") + StudentCreator.student_numbers[i];
        final String email = username + "@onurmail.com";
        final String password = "123456";

        final String student_name = StudentCreator.student_names[i];
        final String parent_name = StudentCreator.parent_names[i];
        //Registration is successul here.
        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();
                                            }

                                        }
                                    });

                            //PUT STUDENT TO THE DB



                        } 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();
                        }

                    }

                });

    }
  }
}

Пожалуйста, помогите. Я с подозрением отношусь к использованию addOnCompleteListener и firebaseAuth. Но я не совсем уверен. Спасибо за любую помощь.

Редактировать: Добавление первого члена без цикла for работает без проблем. Так что я думаю, проблема в цикле for.

1 Ответ

0 голосов
/ 06 сентября 2018

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();
                }

            }

        });    
  }
}

Большая разница в этом коде состоит в том, что он только начинает создавать следующего пользователя, как только он завершит создание предыдущего пользователя и его документа. Это делает это:

  1. удаление текущего студента из списка при его запуске

    final String student_name = student_names.remove(0);
    final String student_number = student_numbers.remove(0);
    final String parent_name = parent_names.remove(0);
    
  2. вызывая себя после написания документа

    // 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, например на компьютере разработчика, на сервере, которым вы управляете, или в облачных функциях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...