Android

Firestore query - checking if username already exists

Запрос Firestore - проверка, уже существует ли имя пользователя

Мне нужна помощь с запросами Firestore. У меня есть all_users сбор данных, документы с идентификаторами пользователей с информацией о каждом пользователе. изображение базы данных firestore я хочу проверить, существует ли имя пользователя уже. я понимаю, как получить () документы и сравнить, как показано на их веб-странице, но как насчет запроса данных?, это мой код

обновление виджетов - (если текстовое поле mUser и текущее имя пользователя не совпадают)

 private void saveProfileSettings(){
final String username = mUsername.getText().toString();
//Case 1: user did not change their username
if (!mUsers.getUsername().equals(username)){

checkingIfusernameExist(username);

}else {

}
}

Метод проверки наличия имени пользователя

    private void checkingIfusernameExist(final String username){
Log.d(TAG, "checkingIfusernameExist: Checking if " + username + " Exists");

Query mQuery = mFirebaseFirestore.collection("all_users")
.orderBy(getString(R.string.fields_username))
.whereEqualTo("username", username);

mQuery.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {

if (documentSnapshots != null){
Log.d(TAG, "onEvent: username does not exists");
Toast.makeText(getActivity(), "Username is available", Toast.LENGTH_SHORT).show();
}
for (DocumentSnapshot ds: documentSnapshots){
if (ds.exists()){
Log.d(TAG, "checkingIfusernameExist: FOUND A MATCH: " + ds.toObject(Users.class).getUsername());
Toast.makeText(getActivity(), "That username already exists.", Toast.LENGTH_SHORT).show();
}
}
}
});
}

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

ОБНОВЛЕНИЕ : после нескольких дней поиска я действительно нашел решение с помощью ответов, которые я получил ниже. итак, поскольку firestore не имеет операционной логики, и вы хотите обновить, если имя пользователя не существует, с помощью .wherequalto , используйте задачу для поиска, которая содержит какую-либо полезную нагрузку.

код, который сработал у меня

Метод проверки, существует ли имя пользователя

private void checkingIfusernameExist(final String usernameToCompare){

//----------------------------------------------------------------
final Query mQuery = mFirebaseFirestore.collection("all_users").whereEqualTo("username", usernameToCompare);
mQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
Log.d(TAG, "checkingIfusernameExist: checking if username exists");

if (task.isSuccessful()){
for (DocumentSnapshot ds: task.getResult()){
String userNames = ds.getString("username");
if (userNames.equals(usernameToCompare)) {
Log.d(TAG, "checkingIfusernameExist: FOUND A MATCH -username already exists");
Toast.makeText(getActivity(), "username already exists", Toast.LENGTH_SHORT).show();
}
}
}
//checking if task contains any payload. if no, then update
if (task.getResult().size() == 0){
try{

Log.d(TAG, "onComplete: MATCH NOT FOUND - username is available");
Toast.makeText(getActivity(), "username changed", Toast.LENGTH_SHORT).show();
//Updating new username............


}catch (NullPointerException e){
Log.e(TAG, "NullPointerException: " + e.getMessage() );
}
}
}
});
Переведено автоматически
Ответ 1

Следующий запрос возвращает всех пользователей с предоставленной usernameToCheck . Если имя пользователя уникально, вы получите только один documentSnapShot.

    Query mQuery = mFirebaseFirestore.collection("all_users")
.whereEqualTo("username", "usernameToCheck");

mQuery.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {

for (DocumentSnapshot ds: documentSnapshots){
if (ds!=null){
String userName = document.getString("username");
Log.d(TAG, "checkingIfusernameExist: FOUND A MATCH: " +userName );
Toast.makeText(getActivity(), "That username already exists.", Toast.LENGTH_SHORT).show();
}
}
}
});
Ответ 2

Чтобы решить эту проблему, пожалуйста, используйте следующие строки кода:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference allUsersRef = rootRef.collection("all_users");
Query userNameQuery = allUsersRef.whereEqualTo("username", "userNameToCompare");
userNameQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (DocumentSnapshot document : task.getResult()) {
if (document.exists()) {
String userName = document.getString("username");
Log.d(TAG, "username already exists");
} else {
Log.d(TAG, "username does not exists");
}
}
} else {
Log.d("TAG", "Error getting documents: ", task.getException());
}
}
});

В котором userNameToCompare имеет тип String и является именем пользователя, с которым вы хотите произвести сравнение.

Ответ 3

Поскольку я не могу прокомментировать, я печатаю это в качестве ответа вместо этого:


Я хочу знать, как выглядят ваши журналы при запуске snapshotListener.


Например, какие из приведенных выше журналов в ваших условиях печатаются на консоли при запуске spanshotListener.


  • Log.d(ТЕГ, "onEvent: имя пользователя не существует");

  • Log.d(ТЕГ, "проверкаIfusernameExist: НАЙДЕНО СООТВЕТСТВИЕ: " + ds.ToObject(Users.class).GetUserName());


Кроме того, вы написали, что не получаете никакого результата, так что можно ли с уверенностью предположить, что вы ожидаете увидеть тосты, но не можете этого сделать?


Кроме того, после беглого просмотра вашего кода я поместил комментарии, основанные на этой документации :

mQuery.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {

if (documentSnapshots != null){
// you are checking here whether your querySnapshot is not null
// instead of checking whether it is null or empty.
// taking a wild guess here but could try to modify
// your if condition as follows -->
// if (documentSnapshots.isEmpty()) {
Log.d(TAG, "onEvent: username does not exists");
Toast.makeText(getActivity(), "Username is available", Toast.LENGTH_SHORT).show();
}
// below as well documentSnapshots is assumed to be not null,
// hence all the more reason I am taking the above wild guess
for (DocumentSnapshot ds: documentSnapshots){
if (ds.exists()){
Log.d(TAG, "checkingIfusernameExist: FOUND A MATCH: " + ds.toObject(Users.class).getUsername());
Toast.makeText(getActivity(), "That username already exists.", Toast.LENGTH_SHORT).show();
}
}
}
});

Я не могу продолжить отладку предоставленных вами данных. Но эта ссылка может помочь вам больше.


java android firebase google-cloud-firestore