为什么我无法将数组上的第一条记录和最后一条记录记录到Firestore

时间:2018-09-06 12:37:35

标签: android firebase nosql firebase-authentication google-cloud-firestore

我正在尝试注册20个用户,并在我的收藏中为Firebase Firestore中的每个用户创建一个文档。我的程序成功注册了20个用户,但为他们创建文档时失败。 18,每次创建19个文档,但是几乎总是跳过为数组的第一个成员和最后一个成员创建文档。 StudentCreator只是一个具有父数组的文件,该数组包含20个项目。 这是来自StudentCreator.java

的数组

flat

这是主要代码:

[['11', '13'], ['17', '19'], ['13', '17'], ['19', '22'], ['35', '14']]

请帮助。我对addOnCompleteListener和firebaseAuth的用法感到怀疑。但我不确定。感谢您的帮助。

编辑:添加没有for循环的第一个成员可以正常工作。所以我想问题出在for循环上。

1 个答案:

答案 0 :(得分:1)

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应用(例如开发计算机,您控制的服务器或Cloud Functions)中使用。