等待在Android应用程序的触发器中创建的文档

时间:2019-05-31 10:52:19

标签: android firebase google-cloud-firestore

我有一个使用Firebase的android应用。当用户注册时,我在firebase上有一个触发器,该触发器在集合中使用用户的默认数据创建一个文档。

这是在firebase上用作触发器的函数代码:

    exports.sendWelcomeEmail = functions.auth.user().onCreate((user) => 
    {  
        var userCoinsCol = db.collection('user_data');
        userCoinsCol.doc(user.uid).set({
            coins : 100, // some another information for user you could save it here.
            active: true,
            completedRewards: 0
        })
        .then(() => {
            console.log("done");
            return;
        })
        .catch((err) =>
        {
            console.log("Error creating data for just created user. => "+err);
            return;
        });
    });

所有这些都能完美地工作。问题在于,注册后,我需要用户数据,并且有时在用户注册时,它还不准备让应用程序在下一个活动中使用。

所以,我的问题是,Android应用程序有什么方法可以等待触发器创建该文档,然后再转到下一个将使用该用户数据的活动?

您可以猜测,这只会在用户注册时触发。稍后,如果用户想再次使用该应用程序,则一切正常,因为用户数据是在用户注册后立即创建的。

编辑:经过一番尝试之后,我有了这个解决方案,但是由于它可以接收很多文档,因此似乎不太有效。我只是添加它以供参考:

public void CreateAccount()
{

    if(!TextUtils.isEmpty(emailreg.getText()) && !TextUtils.isEmpty(passreg.getText()))
    {
        mAuth.createUserWithEmailAndPassword(emailreg.getText().toString(), passreg.getText().toString())
        .addOnCompleteListener(this, new OnCompleteListener<AuthResult>()
        {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task)
            {

                progressBar.setVisibility(View.INVISIBLE);

                if (task.isSuccessful())
                {
                    // Sign in success, update UI with the signed-in user's information
                    final FirebaseUser user = mAuth.getCurrentUser();

                    // ----> Start waiting for the user_data document to be created and go to the next activity
                    FirebaseFirestore db = FirebaseFirestore.getInstance();
                    final EventListener<QuerySnapshot> listener = new EventListener<QuerySnapshot>() {
                        @Override
                        public void onEvent(@javax.annotation.Nullable QuerySnapshot queryDocumentSnapshots, @javax.annotation.Nullable FirebaseFirestoreException e) {
                            List<DocumentSnapshot> documents = queryDocumentSnapshots.getDocuments();

                            boolean found = false;
                            for(DocumentSnapshot ds : documents)
                            {
                                if(ds.getId().equals(user.getUid()))
                                {
                                    Intent intent = new Intent(LoginActivity.this, MainActivity.class); // Call the AppIntro java class
                                    startActivity(intent);
                                }

                            }
                        }
                    };

                    db.collection("user_data").addSnapshotListener(listener);

                } else
                {
                    // If sign in fails, display a message to the user.

                    Toast.makeText(LoginActivity.this, getString(R.string.tryagain), Toast.LENGTH_SHORT).show();

                }

                // ...
            }
        });

    }else
    {
        Toast.makeText(LoginActivity.this, getString(R.string.tryagain), Toast.LENGTH_SHORT).show();
        progressBar.setVisibility(View.INVISIBLE);

    }


}

1 个答案:

答案 0 :(得分:1)

  

所以,我的问题是,Android应用程序有什么方法可以等待触发器创建该文档,然后继续进行下一个创建用户数据的活动?

当然是,通过添加完整的侦听器。这意味着只有将数据成功写入数据库后,您才能进一步操作。当您使用DocumentReference的set()方法时,返回的对象的类型为Task,因此您可以简单地使用addOnCompleteListener()

yourDocumentRef.set(yourObject).addOnCompleteListener(new OnCompleteListener<Void>() {
    @Override
    public void onComplete(@NonNull Task<Void> task) {
        if (task.isSuccessful()) {
            //Do what you need to do
        }
    }
});

编辑:

如果通过Coud Functions将用户文档添加到Cloud Firestore数据库中,则可以更改应用程序的逻辑,并创建用户文档客户端和必填项Security Rules,以使用户不能与之玩耍数据。或者,您可以附加快照侦听器以实时验证数据。创建文档后,请继续进行逻辑处理。