Как я могу запросить в firebase android как триггер базы данных в облачной функции

В облачных функциях Firebase (Javascript) мы используем триггер базы данных, как показано ниже:

functions.database.ref('/DoctorApp/DrTimeSlot/{doctorUID}/Patients/{patientID}')
    .onCreate((snapshot, context) => { 

    // codes here
};

Здесь {doctorUID} неизвестен, поэтому все функции работают со всеми UID.

Можно ли использовать тот же метод в Android Studio (Java)? ниже этот код не работает для меня, вы можете предоставить мне альтернативный код.

Query query = rootData.child("DrTimeSlot/{drUID}/Patients/").orderByChild("patientUID").equalTo(auth.getUid());

query.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                //codes here
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

person Shubham Gupta    schedule 13.12.2019    source источник
comment
Пожалуйста, добавьте структуру своей базы данных в виде файла JSON или хотя бы снимка экрана.   -  person Alex Mamo    schedule 13.12.2019
comment
В клиентских запросах нет подстановочных знаков. Вы должны знать путь к единственному узлу, который хотите запросить.   -  person Doug Stevenson    schedule 13.12.2019


Ответы (2)


Хотя невозможно использовать тот же синтаксис, что и в облачных функциях, ваш запрос для поиска всех врачей с заданным идентификатором пациента может быть выполнен с помощью:

Query query = rootData.child("DrTimeSlot").orderByChild("Patients/" + auth.getUid()).startAt(""); // startAt("") will exclude non-existent values

query.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot queryDataSnapshot) {
        if (queryDataSnapshot.hasChildren()) {
            // handle no results
            System.out.println("No results returned");
            return;
        }

        for (DataSnapshot doctorDataSnapshot: dataSnapshot.getChildren()) {
            // TODO: handle the data
            System.out.println(doctorDataSnapshot.getKey() + " => " + doctorDataSnapshot.getValue());
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        // Getting doctors failed, log a message
        Log.w(TAG, "findDoctorsForUser:onCancelled", databaseError.toException());
    }
});

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

Вместо этого в пользовательских данных конкретного пользователя сохраните список его врачей. Когда вам нужно их найти, загрузите /users/userId1/doctors, а затем получите необходимые данные пациента от каждого врача, ограничив доступ для чтения / записи для этого врача и этого пользователя только.

"users": {
  "userId1": {
    "doctors": {
      "doctorId1": true, // boolean value for simplicity
      "doctorId2": "paediatrician", // could also use value for type
      "doctorId3": 10, // or number of visits
      "doctorId4": false, // or if they are an active patient of this doctor
    },
    ...
  },
  ...
}
person samthecodingman    schedule 13.12.2019

В android вы не можете выполнить этот запрос child("DrTimeSlot/{drUID}/Patients/"), все 3 узла должны быть известны.

Если вы не знаете drUID, тогда, когда вы сначала сохранили его в базе данных, вы можете сохранить его в переменной и передать переменную, например:

String drUID = ref.push().getKey();

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

person Peter Haddad    schedule 13.12.2019