Как получить доступ к коллекции Firebase Firestore более чем одним зарегистрированным пользователям в android студийном приложении, используя java? - PullRequest
0 голосов
/ 29 апреля 2020

Проблема, с которой я сталкиваюсь, заключается в следующем: когда пользователь 2 пытается получить доступ к той же коллекции баз данных, а не показывает, что некоторые данные уже существуют в базе данных (требуется, чтобы данные, введенные пользователем 1, были сохранены в той же базе данных) Я получаю ноль в базе данных. Я мог бы также выяснить, почему это произошло, но не знал, как запросить коллекцию пожарных хранилищ таким образом, чтобы разные пользователи сохраняли уникальные значения для полей документа «StartTime» и «EndTimes» в коллекции BookingInformation?

Ниже приведен код, который я использовал;

 FirebaseAuth fAuth = FirebaseAuth.getInstance();
 String userId = fAuth.getCurrentUser().getUid();
 Log.d(TAG,"userID: "+userId);

 FirebaseFirestore fstore = FirebaseFirestore.getInstance();
 DocumentReference docRef = 
       fstore.collection("BookingInformation").document(userId);

Это произошло так, потому что я использовал userId в качестве идентификатора документа коллекции "BookingInformation". При этом каждый раз при входе нового пользователя создается новый документ. Как мне решить эту проблему, чтобы убедиться, что когда пользователь 2 вводит данные, он сначала проверяет, существует ли какой-либо документ в коллекции?

Отредактировано: BookingInformation

Добавлен код

NewBookingFragment. java

newBookingViewModel.getBookingInformation().observe(getViewLifecycleOwner(), new Observer<BookingInfo>() {
        @Override
        public void onChanged(final BookingInfo bookingInfo) {
            Log.d(TAG,"hi from bookingInfodatabase");
            Log.d(TAG,"content of bookingInfodatabase"+bookingInfo);

            if (bookingInfo == null) {
                Log.d(TAG,"no data from database, so add as a new");
                Toast toast = Toast.makeText(getActivity().getApplicationContext(), "No data from database, so add as a new booking information", Toast.LENGTH_SHORT);
                toast.show();

                searchBtn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast toast1 = Toast.makeText(getActivity().getApplicationContext(), "No data in database to compare!", Toast.LENGTH_SHORT);
                        toast1.show();
                    }
                });

                addBtn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Log.d(TAG, "user id in fragment class: "+currentUserId);

                        final Map<String, Object> reserveInfo = new HashMap<>();
                        reserveInfo.put("Date",date.getText().toString());
                        reserveInfo.put("StartTime",startTime.getText().toString());
                        reserveInfo.put("EndTime",endTime.getText().toString());
                        reserveInfo.put("UserId",currentUserId);

                        dataStore.collection("BookingInformation").document(currentUserId).set(reserveInfo)
                                .addOnCompleteListener(new OnCompleteListener<Void>() {
                                    @Override
                                    public void onComplete(@NonNull Task<Void> task) {
                                        Toast toast4 = Toast.makeText(getActivity().getApplicationContext(), "Area reserved successfully", Toast.LENGTH_SHORT);
                                        toast4.show();
                                    }
                                })
                                .addOnFailureListener(new OnFailureListener() {
                                    @Override
                                    public void onFailure(@NonNull Exception e) {
                                        Toast toast5 = Toast.makeText(getActivity().getApplicationContext(), "Reservation failed", Toast.LENGTH_SHORT);
                                        toast5.show();
                                    }
                                });
                    }


                });

            }else{
                searchBtn.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        Log.d(TAG,"after clicking available button");
                        Log.d(TAG,"booking id"+bookingInfo.getBookingDocId());
                        Log.d(TAG,"database time: "+bookingInfo.getStartTime());
                        Log.d(TAG,"user input time: "+startTime.getText().toString());
                        Log.d(TAG,"comparing time: "+bookingInfo.getStartTime().equals(startTime.getText().toString()));
                        if (bookingInfo.getDate().equals(date.getText().toString()) ){
                            Log.d(TAG, "Date check ");
                            if (bookingInfo.getStartTime().equals(startTime.getText().toString()) && bookingInfo.getEndTime().equals(endTime.getText().toString())) {
                                Toast toast = Toast.makeText(getActivity().getApplicationContext(), "Select another time.", Toast.LENGTH_SHORT);
                                toast.show();
                                Log.d(TAG, "start and end time check ");
                                if (bookingInfo.getStartTime().equals(startTime.getText().toString())) {
                                    Log.d(TAG, "start time check ");
                                    if (bookingInfo.getEndTime().equals(endTime.getText().toString())) {
                                        Toast toast2 = Toast.makeText(getActivity().getApplicationContext(), "Select another end time.", Toast.LENGTH_SHORT);
                                        toast2.show();
                                        Log.d(TAG, "end time check ");
                                    }
                                    Log.d(TAG, "end time not equal check ");
                                }
                                Log.d(TAG, "start time not equal check ");
                            }
                            else{
                                Toast toast4 = Toast.makeText(getActivity().getApplicationContext(), "Area available at this time,'Book' it.", Toast.LENGTH_SHORT);
                                toast4.show();
                                availabletextView.setText("Area available");

                                addBtn.setOnClickListener(new View.OnClickListener() {
                                    @Override
                                    public void onClick(View v) {
                                        Log.d(TAG, "user id in fragment class: "+currentUserId);

                                        final Map<String, Object> reserveInfo = new HashMap<>();
                                        reserveInfo.put("Date",date.getText().toString());
                                        reserveInfo.put("StartTime",startTime.getText().toString());
                                        reserveInfo.put("EndTime",endTime.getText().toString());
                                        reserveInfo.put("UserId",currentUserId);

                                        dataStore.collection("BookingInformation").document(currentUserId).set(reserveInfo)
                                                .addOnCompleteListener(new OnCompleteListener<Void>() {
                                                    @Override
                                                    public void onComplete(@NonNull Task<Void> task) {
                                                        Toast toast4 = Toast.makeText(getActivity().getApplicationContext(), "Area reserved successfully", Toast.LENGTH_SHORT);
                                                        toast4.show();
                                                    }
                                                })
                                                .addOnFailureListener(new OnFailureListener() {
                                                    @Override
                                                    public void onFailure(@NonNull Exception e) {
                                                        Toast toast5 = Toast.makeText(getActivity().getApplicationContext(), "Reservation failed", Toast.LENGTH_SHORT);
                                                        toast5.show();
                                                    }
                                                });
                                    }
                                });
                            }
                        } else {
                            availabletextView.setText("Area available");
                            Log.d(TAG, "user id: "+currentUserId);
                            addBtn.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View v) {
                                    Log.d(TAG, "user id in fragment class: "+currentUserId);



                                    final Map<String, Object> reserveInfo = new HashMap<>();
                                    reserveInfo.put("Date",date.getText().toString());
                                    reserveInfo.put("StartTime",startTime.getText().toString());
                                    reserveInfo.put("EndTime",endTime.getText().toString());
                                    reserveInfo.put("UserId",currentUserId);

                                    dataStore.collection("BookingInformation").document(currentUserId).set(reserveInfo)
                                            .addOnCompleteListener(new OnCompleteListener<Void>() {
                                                @Override
                                                public void onComplete(@NonNull Task<Void> task) {
                                                    Toast toast4 = Toast.makeText(getActivity().getApplicationContext(), "Area reserved successfully", Toast.LENGTH_SHORT);
                                                    toast4.show();
                                                }
                                            })
                                            .addOnFailureListener(new OnFailureListener() {
                                                @Override
                                                public void onFailure(@NonNull Exception e) {
                                                    Toast toast5 = Toast.makeText(getActivity().getApplicationContext(), "Reservation failed", Toast.LENGTH_SHORT);
                                                    toast5.show();
                                                }
                                            });
                                }
                            });
                        }
                    }
                });
            }
        }
    });

NewBookingViewModel. java

public class NewBookingViewModel extends ViewModel {
private static final String TAG = "Firelog";

public LiveData<BookingInfo> getBookingInformation() {
    final MutableLiveData<BookingInfo> bookingInfoMutableLiveData = new MutableLiveData<>();
    FirebaseAuth fAuth = FirebaseAuth.getInstance();
    String userId = fAuth.getCurrentUser().getUid();
    Log.d(TAG,"userID: "+userId);

    FirebaseFirestore fstore = FirebaseFirestore.getInstance();
    DocumentReference docRef = fstore.collection("BookingInformation").document(userId);
    Log.d(TAG,"docRef"+docRef);
    String docid = docRef.getId();
    Log.d(TAG,"document id"+docid);

    docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            if (task.isSuccessful()) {
                Log.d(TAG,"hi from viewmodel database");

                DocumentSnapshot documentSnapshot = task.getResult();
                Log.d(TAG, "Doc ID: "+documentSnapshot.getId());
                Log.d(TAG,"document exist: "+documentSnapshot.exists());

                if (documentSnapshot != null && documentSnapshot.exists()) {
                    String date = documentSnapshot.getString("Date");
                    String startTime = documentSnapshot.getString("StartTime");
                    String endTime = documentSnapshot.getString("EndTime");

                    BookingInfo bookingInfo = documentSnapshot.toObject(BookingInfo.class);
                    Log.d(TAG,"hi from viewmodel date: "+date);
                    bookingInfo.setDate(date);
                    bookingInfo.setStartTime(startTime);
                    bookingInfo.setEndTime(endTime);

                    bookingInfoMutableLiveData.postValue(bookingInfo);
                } else {
                    bookingInfoMutableLiveData.postValue(null);
                }
            } else {
                bookingInfoMutableLiveData.postValue(null);
            }
        }
    });
    return bookingInfoMutableLiveData;
}
}

Спасибо.

1 Ответ

0 голосов
/ 30 апреля 2020

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

Ниже приведен код «NewBookingViewModel. java»

 fstore.collection("BookingInformation")
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful()) {
                        QuerySnapshot querySnapshot = task.getResult();

                        if (!querySnapshot.isEmpty()) {

                            for (QueryDocumentSnapshot queryDocumentSnapshot : task.getResult()) {
                                count++;
                                Log.d(TAG, "document count: "+count);
                                if (count != 0) {
                                    String date = queryDocumentSnapshot.getString("Date");
                                    String startTime = queryDocumentSnapshot.getString("StartTime");
                                    String endTime = queryDocumentSnapshot.getString("EndTime");

                                    BookingInfo bookingInfo = queryDocumentSnapshot.toObject(BookingInfo.class);
                                    bookingInfo.setBookingDocId((queryDocumentSnapshot.getId()));
                                    bookingInfo.setDate(date);
                                    bookingInfo.setStartTime(startTime);
                                    bookingInfo.setEndTime(endTime);

                                    bookingInfoMutableLiveData.postValue(bookingInfo);

                                }else {
                                    Log.d(TAG, "No booking data");
                                }
                            }
                        } else {
                            bookingInfoMutableLiveData.postValue(null);
                        }
                    } else {
                        bookingInfoMutableLiveData.postValue(null);
                    }
                }
            });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...