Как я могу проверить, существуют ли данные в базе данных? - PullRequest
0 голосов
/ 16 апреля 2019

Я разрабатываю мобильное приложение для бронирования, в котором, когда я нажимаю кнопку checkAvailability, оно проверит, существуют ли данные в базе данных. Моя проблема в том, что я не знаю, как получить доступ, так как ключ генерируется случайным образом. У меня много похожих вопросов, но решения для меня не сработали.

База данных Firebase (снимок экрана):

Database

btnAvailability.setOnClickListener

btnAvailability.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Query userQuery = database.getInstance().getReference().child("Requests")
                    .orderByChild("order/0");
            userQuery.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    String type = dataSnapshot.child("checkIn").getValue().toString();
                    String type2 = dataSnapshot.child("productName").getValue().toString();
                    if(type.equals(checkInTV.getText().toString()) && type2.equals(beach_name.getText().toString())) {
                        Toast.makeText(details.this, "Not Available", Toast.LENGTH_SHORT).show();
                    }else
                    {
                        Toast.makeText(details.this, "Available", Toast.LENGTH_SHORT).show();
                    }

                }

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

                }
            });

        }
    });

Ответы [ 3 ]

1 голос
/ 16 апреля 2019

Судя по всему, вы пытаетесь проверить, есть ли у ребенка order/0 с определенными checkIn и productName ниже Requests. В вашей текущей структуре данных вы можете сделать это с помощью:

Query userQuery = database.getInstance().getReference().child("Requests")
        .orderByChild("order/0");
userQuery.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
            String type = snapshot.child("checkIn").getValue().toString();
            String type2 = snapshot.child("productName").getValue().toString();
            if(type.equals("Saturday, April 20, 2019") && type2.equals("The Mansion")) {
                Toast.makeText(details.this, "Not Available", Toast.LENGTH_SHORT).show();
            }
            else {
                Toast.makeText(details.this, "Available", Toast.LENGTH_SHORT).show();
            }
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException()
    }
});

Отличия от вашего кода:

  • У меня есть цикл внутри onDataChange, так как запрос может иметь несколько результатов.
  • Я жестко закодировал дату, чтобы исключить проблему, вызванную тем, как вы вводите данные в текстовом представлении.
  • Я работаю с onCancelled, поскольку игнорировать ошибки - просто плохая идея.

Более эффективный способ сделать то же самое - заставить Firebase выполнить часть запроса, например так:

Query userQuery = database.getInstance().getReference().child("Requests")
        .orderByChild("order/0/checkIn").equalTo("Saturday, April 20, 2019");
userQuery.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
            String type2 = snapshot.child("productName").getValue().toString();
            if(type2.equals("The Mansion")) {
                Toast.makeText(details.this, "Not Available", Toast.LENGTH_SHORT).show();
            }
            else {
                Toast.makeText(details.this, "Available", Toast.LENGTH_SHORT).show();
            }
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException()
    }
});

Здесь изменение:

  • Я переместил часть проверки в запрос, чтобы Firebase мог выполнить этот фильтр на сервере. Это означает, что он должен загружать меньше данных клиенту, делая его быстрее и дешевле.
  • Вам все равно придется фильтровать второе значение на стороне клиента, поскольку запросы Firebase могут упорядочивать / фильтровать только по одному свойству. Подробнее об этом см. Запрос на основе нескольких предложений where в Firebase .

Обратите внимание, что вы запрашиваете двойные вложенные данные. Хотя вы можете заставить это работать для определенного заказа (orders/0 в этом примере), если у вас может быть несколько заказов в запросе, Firebase не сможет выполнять запросы по всем из них.

Подробнее об этом и решении см .: Firebase Query Double Nested

Я бы также порекомендовал прочитать мои ответы о категориях моделирования, потому что у меня есть ощущение, что вам это понадобится в ближайшее время: Запрос Firebase, если child of child содержит значение

0 голосов
/ 17 апреля 2019

Наконец-то нашел решение по моей проблеме.

        btnAvailability.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Query userQuery = database.getInstance().getReference().child("Requests")
                    .orderByChild("order/0/checkIn").equalTo(checkInTV.getText().toString());
            userQuery.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
                        String type2 = snapshot.child("order/0/productName").getValue().toString();
                        if(type2.equals(beach_name.getText().toString())) {
                            Toast.makeText(details.this, "Not Available", Toast.LENGTH_SHORT).show();
                        }
                        else {
                            Toast.makeText(details.this, "Available", Toast.LENGTH_SHORT).show();
                        }
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                    throw databaseError.toException();
                }
            });

        }
    });
0 голосов
/ 16 апреля 2019

При хранении данных вам нужно сделать идентификатор электронной почты пользователя первым параметром, чтобы вы могли получить доступ к данным на основе пользователя.

{"reuest":{"xyz@gmail.com":{"orders":[{"checkin":"21:29"},{"checkin":"2:19"}]},"abc@gmail.com":{"orders":[{"checkin":"21:29"},{"checkin":"2:19"}]}}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...