Связывание данных Firebase

Я создаю приложение, и мне нужно постоянно сопоставлять данные в действии. Я использую firebase для базы данных, и у меня возникают проблемы с правильным запросом. Я хочу сопоставить данные в дочернем элементе (uid) с другими данными в другом дочернем элементе (uid), в этом случае я все еще тестирую только дату.

Обновлено: мне нужно сопоставить дочерний элемент uid1 (в данном случае дату) со ВСЕМИ СУЩЕСТВУЮЩИМИ датами, доступными в «Расписаниях». Мое плохое ... предыдущий заданный вопрос был неправильным, где я сказал "сопоставление данных uid1 с данными uid2"

Связывание данных Firebase

Вот мой код. Я думаю, что мои условия неправильные.

 mInstance.getReference("Schedules").addValueEventListener(new ValueEventListener(){
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Schedule schedule = dataSnapshot.child(uid).getValue(Schedule.class);


                for(DataSnapshot data: dataSnapshot.getChildren()) {
                    if (dataSnapshot.child(uid).child("date").exists() && dataSnapshot.child(uid).child("date").getChildrenCount()>= 2) {
                        test.setText("Found Match for " + schedule.date + "," + schedule.sport + ", and " + schedule.location);
                    } else {
                        test.setText(schedule.date + schedule.sport + schedule.location);
                    }

                }

        }
        public void onCancelled(DatabaseError error) {
            // Failed to read value
            Log.w(TAG, "Failed to read value.", error.toException());
        }

Итак, вы хотите сравнить дату uid1 с датой uid2 в этом случае, верно?

PradyumanDixit 03.12.2018 08:02

На самом деле, я хотел сравнить даты со всеми датами в дочернем элементе расписаний. Я ошибся, объясняя свой случай. Прости.

Michael Wijaya 04.12.2018 08:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
272
2

Ответы 2

Глядя на вашу базу данных, невозможно, чтобы ребенок («свидание») с дочерними элементами считал больше двух. Если я могу спросить, зачем это нужно?

Есть два разных подхода к решению этой проблемы.

  1. Получите список <> всех расписаний из базы данных и просто сравните uid

    или

  2. Если вы уже знаете uid данных, которые ищете, получите данные из базы данных.

Подробнее о запросе firebase

    private Query queryGetSchedule;
    private Query queryAllSchedule;
    private ValueEventListener schedulesListener;
    private ValueEventListener allSchedulesListener;
    private FirebaseDatabase;

    //Inside onCreate or class your are using
    this.context = context; //pass in context 
    this.app = FirebaseApp.initializeApp(context);
    this.id = myid;
    if (firebaseDatabase == null) firebaseDatabase = FirebaseDatabase.getInstance();

    queryGetSchedule = firebaseDatabase.getReference("Schedules").Child("key");
    queryAllSchedule = firebaseDatabase.getReference().child("Schedules");



      /**
     * This will get you a single schedule
     */
    public void getSingleSchedules()
    {
        if (schedulesListener == null)
        {
            schedulesListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    // Get Post object and use the values to update the UI

                    if (dataSnapshot.exists()) {
                        for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                           // MainActivity.userBook = snapshot.getValue(UserBook.class);
                            Schedule schedule = snapshot.getValue(Schedule.class);
                            callback.onUserCallback(userBook);
                        }
                    }

                }


                @Override
                public void onCancelled(DatabaseError databaseError) {
                    // Getting Post failed, log a message

                }
            };
        }
        queryGetSchedule.addListenerForSingleValueEvent(schedulesListener);
    }



    /**
    *This will get you all your schedules in a list so you can easily compare
    * Let assume you are passing in schedule of interest into this method
    */
    public void getAllSchedulesListener(Schedule scheduleOfInterest) {

        if (allSchedulesListener == null) {
            allSchedulesListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    // Get Post object and use the values to update the UI

                    //Use this for list of objects passing in the type
                    GenericTypeIndicator<List<Schedule>> schedulesList = 
                    new GenericTypeIndicator<List<Schedule>>() {
                    };

                    if (dataSnapshot.exists()) {

                       List<Schedule> mySchedulesList = dataSnapshot.getValue(schedulesList);

                       //after you get this full list of schedule you can compare with date as a string 
                        for(Schedule schedule: mySchedulesList)
                        {
                            if (scheduleOfInterest.date.equals(schedule.date)
                            {
                                //found it 
                                //do whatever here
                            }
                        }

                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    // Getting Post failed, log a message
                }
            };
        }
      queryAllSchedule.addListenerForSingleValueEvent(allSchedulesListener);
    }

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

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidOneRef = rootRef.child("Schedules").child(uidOne);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String dateOne = ds.child("date").getValue(String.class);

        Query uidTwoRef = rootRef.child("Schedules").orderByChild("date").equalTo(dateOne);
        ValueEventListener eventListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                String dateTwo = ds.child("date").getValue(String.class);
                Schedule schedule = dataSnapshot.getValue(Schedule.class);

                if (dateOne.equals(dateTwo)) {
                    test.setText("Found Match for " + schedule.date + "," + schedule.sport + ", and " + schedule.location);
                } else {
                    test.setText(schedule.date + schedule.sport + schedule.location);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
            }
        };
        uidTwoRef.addListenerForSingleValueEvent(eventListener);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
uidOneRef.addListenerForSingleValueEvent(valueEventListener);

В котором uidOne и uidTwo - это идентификаторы пользователей, которых вы хотите проверить. Я настоятельно рекомендую вам хранить данные как timestamp, а не как строку, как объясняется здесь.

Привет, я думаю, что сделал неправильное объяснение, я хочу, чтобы код был динамическим, поэтому я могу сравнить дату (скажем, date1) с КАЖДОЙ датой, доступной в «Расписаниях».

Michael Wijaya 09.12.2018 13:34

В этом случае см. Мой обновленный ответ. Это работает?

Alex Mamo 09.12.2018 13:50

Спасибо за помощь, но, к сожалению, это не помогло. Я получил ошибку в этой строке: DatabaseReference uidTwoRef = rootRef.child ("Расписания"). OrderByChild ("date"). EqualTo (date‌ One); Он говорит, что это тип запроса и не может перейти к типу DatabaseReference. Я пытался настроить его, но все равно не работает.

Michael Wijaya 10.12.2018 08:18

Да, ты прав. Это должен быть Qyery, а не DatabaseReference.. См. Мой обновленный ответ. А теперь работает?

Alex Mamo 10.12.2018 08:20

Он успешно скомпилирован, но дает мне нулевое значение для этого: test.setText (schedule.date + schedule.sport + schedule.location); Я считаю, что ссылка на базу неверна, я все еще работаю над этим.

Michael Wijaya 10.12.2018 08:52

Ошибки нет, но возвращается нулевое значение.

Michael Wijaya 10.12.2018 09:00

Если вы пытаетесь Log.d(TAG, dateTwo);, то какой выход?

Alex Mamo 10.12.2018 09:11

Что делать, если использовать Log.d(TAG, dateOne);?

Alex Mamo 10.12.2018 09:18

Показал 2018-12-10 15:20:24.977 11249-11249/com.sparingan D/MainMenu: 9/12/2018. Итак, dateOne верна. Но dateTwo имеет значение null.

Michael Wijaya 10.12.2018 09:26

Другие вопросы по теме