Ожидание документа, созданного в триггере в приложении для Android - PullRequest
2 голосов
/ 31 мая 2019

У меня есть приложение для 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 Ответ

1 голос
/ 31 мая 2019

Итак, мой вопрос, есть ли способ для приложения 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
        }
    }
});

Edit:

Если пользовательский документ добавляется в базу данных Cloud Firestore через Coud Functions, вы можете либо изменить логику своего приложения и создать клиентскую часть пользовательского документа вместе с Правилами безопасности , которые являются обязательными для ваших пользователей. не может играть с данными. Или вы прикрепляете прослушиватель снимков для проверки данных в реальном времени. Как только документ создан, продолжайте с логикой.

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