Firebase данных сопоставления - PullRequest
0 голосов
/ 03 декабря 2018

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

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

This  is the database tree

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

 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());
        }

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

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

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, а не как строку, как объясняется здесь .

0 голосов
/ 03 декабря 2018

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

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

  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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...