Android Cloud Firestore: запрос, чтобы найти имя пользователя - PullRequest
0 голосов
/ 01 июня 2018

Я искал несколько решений здесь, но не смог найти ничего конкретного в моей ситуации, и поэтому публикую здесь вопрос, пока продолжаю искать решение.Я все еще новичок в Firestore, и их руководство / документы до сих пор неясны.

В моем телефонном приложении есть система, позволяющая пользователю вводить имя.Это имя должно использоваться для обхода базы данных Firestore, и если имя существует как поле для одного из пользователей, метод должен вернуть логическое значение true.

. Этот запрос должен быть вызванкнопка «Продолжить», которая находится в моей основной деятельности, как показано ниже:

    //Authenticate user and proceed to next activity
    continueBtn = (Button) findViewById(R.id.continue_btn);
    continueBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //On click create a db reference and perform a query on it to find current user
            //and authenticate it.
            CollectionReference myRef = database.collection("users");
            Query findNameQ = myRef.whereEqualTo("name", mUserName);
            authenticateUser(findNameQ, mUserName);//I need to pass to this method a variable 'findNameQ' which can be used to validate the existence of a user.
            //mUserName is the name it's looking for.
        }

    });

После выполнения запроса он запускает метод authenticateUser, который в основном проверяет существование пользователя и создает новый, еслипользователь не существуетВот метод:

private void authenticateUser(Query findNameQ, String mUserName)
{
    //Read from database and check if user exists
    //if current users name matches to one in database then set userExists to true.
    if (findNameQ != null)
    {
        userExists = true;
        Toast.makeText(this, "User exists!", Toast.LENGTH_SHORT).show();
    }
        Toast.makeText(this, "User doesn't exist!", Toast.LENGTH_SHORT).show();
}

Я бы хотел использовать if (findNameQ! = False) вместо null, как мне сделать так, чтобы моя переменная findNameQ была логической, а не объектом запроса?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Чтобы узнать, существует ли имя пользователя в базе данных Firestore, вам нужно использовать вызов get().Просто создание объекта Query не даст вам много.Кроме того, если вы проверяете findNameQ != null, он всегда будет иметь значение true, поскольку объект findNameQ создан и никогда не будет null.Поэтому, чтобы решить эту проблему, используйте следующие строки кода:

productsRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            for (QueryDocumentSnapshot document : task.getResult()) {
                if (document.exists()) {
                    authenticateUser(findNameQ, mUserName);
                }
            }
        }
    }
});

Обратите также внимание, что использование addSnapshotListener не поможет вам, потому что он подключит слушателя для получения данных в режиме реального времени, но этоэто не то, что вам нужно.Вам нужно получить данные только один раз.

0 голосов
/ 01 июня 2018

Вы можете использовать логическую переменную в качестве логического имени nameFound = false;

Теперь присоедините прослушиватель снимков к вашему запросу, чтобы проверить, существует имя или нет:

    findNameQ.addSnapshotListener(new EventListener<QuerySnapshot>(){
                @Override
                public void onEvent(QuerySnapshot queryDocumentSnapshots, FirebaseFirestoreException e) {
                    for (DocumentSnapshot ds: queryDocumentSnapshots){
                        if (ds!=null && ds.exists()){
                            Toast.makeText(RegisterActivity.this, "Username Exists!", Toast.LENGTH_SHORT).show();
                            nameFound = true;
                        }
                    }
                }
            });

, иначебудет использовано значение по умолчанию для nameFound, которое равно false.Теперь use может использовать if else для вызова вашего метода аутентификации на основе значения nameFound.

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