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

正在等待在android应用程序的触发器中创建文档,android,firebase,google-cloud-firestore,Android,Firebase,Google Cloud Firestore,我有一个使用firebase的android应用程序。当用户注册时,我在firebase上有一个触发器,它使用用户的默认数据在集合中创建一个文档 这是在firebase上用作触发器的函数的代码: exports.sendWelcomeEmail = functions.auth.user().onCreate((user) => { var userCoinsCol = db.collection('user_data'); userC

我有一个使用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);

    }


}
public void CreateAccount()
{
如果(!TextUtils.isEmpty(emailreg.getText())和&!TextUtils.isEmpty(passreg.getText())
{
mAuth.createUserWithEmailAndPassword(emailreg.getText().toString(),passreg.getText().toString())
.addOnCompleteListener(这是新的OnCompleteListener()
{
@凌驾
未完成的公共void(@NonNull任务)
{
progressBar.setVisibility(View.INVISIBLE);
if(task.issusccessful())
{
//登录成功,使用登录用户的信息更新UI
最终FirebaseUser=mAuth.getCurrentUser();
//--->开始等待创建用户数据文档并转到下一个活动
FirebaseFirestore db=FirebaseFirestore.getInstance();
最终EventListener=新的EventListener(){
@凌驾
public void onEvent(@javax.annotation.Nullable QuerySnapshot queryDocumentSnapshots,@javax.annotation.Nullable FirebaseFirestoreException e){
List documents=queryDocumentSnapshots.getDocuments();
布尔值=false;
用于(文档快照:文档)
{
如果(ds.getId().equals(user.getUid()))
{
Intent Intent=new Intent(LoginActivity.this,MainActivity.class);//调用AppIntro java类
星触觉(意向);
}
}
}
};
db.collection(“用户数据”).addSnapshotListener(监听器);
}否则
{
//如果登录失败,则向用户显示消息。
Toast.makeText(LoginActivity.this、getString(R.string.tryagain)、Toast.LENGTH_SHORT.show();
}
// ...
}
});
}否则
{
Toast.makeText(LoginActivity.this、getString(R.string.tryagain)、Toast.LENGTH_SHORT.show();
progressBar.setVisibility(View.INVISIBLE);
}
}
所以,我的问题是,android应用程序是否可以等待触发器创建该文档,然后再进行下一个创建该用户数据的活动

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

yourDocumentRef.set(yourObject.addOnCompleteListener(新的OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
//做你需要做的事
}
}
});
编辑:


如果用户文档通过Coud函数添加到云Firestore数据库,则您可以更改应用程序的逻辑并创建用户文档客户端,该客户端是必需的,因此您的用户无法使用数据。或者附加快照侦听器以实时验证数据。创建文档后,请继续逻辑。

我有点困惑。set方法通过创建新用户时触发的触发器在服务器上执行。我的应用程序不负责创建此数据。它只负责用它填充我的UI。因此,我无法处理set()方法返回的数据。我错过什么了吗?我已经用为触发器运行的firebase函数代码更新了这个问题,那么您不是正在为相应的客户端创建文档吗?不是。当用户通过我的应用程序注册时,firebase功能正在侦听register事件,并在服务器中执行我发布的代码,以在与用户关联的user_数据集合中创建文档。我不想在我的应用程序中执行此设置,因为它包含我不希望用户使用的数据。例如,他们在我的应用程序中注册时收到的硬币数量。我曾尝试聆听集合更改以检查文档是否已创建,但我认为这不是正确的方法。我现在也要发布这个代码。更新问题…在这种情况下,您应该更改用户文档的逻辑,并在客户端创建用户文档。安全规则是强制性的,因此您不能使用数据。或附加快照侦听器以实时验证数据。一旦文档被创建,就要按照逻辑进行操作。因此,要做到这一点并不容易。卑鄙的人。谢谢你的确认。如果你把它移动到一个答案,我会把它标记为“已回答”。一旦通过身份验证,你就可以使用文档的uid来监听
yourDocumentRef.set(yourObject).addOnCompleteListener(new OnCompleteListener<Void>() {
    @Override
    public void onComplete(@NonNull Task<Void> task) {
        if (task.isSuccessful()) {
            //Do what you need to do
        }
    }
});