Запрос 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();
}
}
}
});
Я не могу продолжить отладку предоставленных вами данных. Но эта ссылка может помочь вам больше.