Как сделать запрос базы данных Firebase в Android - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть вопрос, касающийся базы данных Android Studio Firebase.В настоящее время я пытаюсь наложить условие на запрос, чтобы отправить уведомление для выбранного запроса, в данном случае send notification if MenuId=01, выбранного в моей базе данных Firebase, надеюсь, вы поможете, спасибо.

    if (request.getFoods().isEmpty()) {
         Toast.makeText(Cart.this, "Your cart is empty", Toast.LENGTH_SHORT).show();
     } else{

         final DatabaseReference MyMenuId = FirebaseDatabase.getInstance().getReference("foods");
         final Query data = MyMenuId.orderByChild("MenuId").equalTo("01"); // get all node with menuID=01

Попытка выяснить, как поставить условие для этого MenuId=01, чтобы отправлять уведомление только при выборе этого MenuId:

    data.addValueEventListener(new ValueEventListener() {
        @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                String order_number = String.valueOf(System.currentTimeMillis());
                requests.child(order_number).setValue(request);

                // Delete Cart
                new Database(getBaseContext()).cleanCart();
                Toast.makeText(Cart.this, "You have ordered from menu 1", Toast.LENGTH_SHORT).show();
                finish();
                sendNotificationOrder(order_number);
                Toast.makeText(Cart.this, "You did not order from menuId 1", Toast.LENGTH_SHORT).show();
        }**

Ответы [ 2 ]

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

Вызывается onDataChange, независимо от того, есть результат или нет.Чтобы проверить, есть ли фактический результат, используйте dataSnapshot.exists():

data.addValueEventListener(new ValueEventListener() {
    @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
          if (dataSnapshot.exists()) {
            String order_number = String.valueOf(System.currentTimeMillis());
            requests.child(order_number).setValue(request);

            // Delete Cart
            new Database(getBaseContext()).cleanCart();
            Toast.makeText(Cart.this, "You have ordered from menu 1", Toast.LENGTH_SHORT).show();
            finish();
            sendNotificationOrder(order_number);
            Toast.makeText(Cart.this, "You did not order from menuId 1", Toast.LENGTH_SHORT).show();
          }
        }

Если вам действительно нужно обработать результат, помните следующее.

При выполнениизапрос к базе данных Firebase, возможно, будет несколько результатов.Таким образом, снимок содержит список этих результатов.Даже если есть только один результат, снимок будет содержать список из одного результата.

Таким образом, ваш код должен обрабатывать список результатов, перебирая dataSnapshot.getChildren():

data.addValueEventListener(new ValueEventListener() {
    @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
          for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
            String order_number = String.valueOf(System.currentTimeMillis());
            requests.child(order_number).setValue(request);

            // Delete Cart
            new Database(getBaseContext()).cleanCart();
            Toast.makeText(Cart.this, "You have ordered from menu 1", Toast.LENGTH_SHORT).show();
            finish();
            sendNotificationOrder(order_number);
            Toast.makeText(Cart.this, "You did not order from menuId 1", Toast.LENGTH_SHORT).show();
          }
        }
0 голосов
/ 09 декабря 2018

Вам не нужно ставить условие, просто используйте addListenerForSingleValueEvent, оно будет выполнено только после того, как будет найдено целевое значение. Вы использовали addValueListener, который прослушивает все значения в узле, и вы хотите найтиодно значение, лучше использовать слушатель с одним значением.

DatabaseReference MyMenuId = FirebaseDatabase.getInstance().getReference("foods").child("MenuId").orderByChild("city").equalTo(
 final Query data = MyMenuId.orderByChild("MenuId").equalTo("01"); // get all node with menuID=01

          data.addListenerForSingleValueEvent(new ValueEventListener() { 
        @Override 
            public void onDataChange(DataSnapshot dataSnapshot) {
                String order_number = String.valueOf(System.currentTimeMillis());
                requests.child(order_number).setValue(request);

                // Delete Cart 
                new Database(getBaseContext()).cleanCart();
                Toast.makeText(Cart.this, "You have ordered from menu 1", Toast.LENGTH_SHORT).show();
                finish();
                sendNotificationOrder(order_number);
                Toast.makeText(Cart.this, "You did not order from menuId 1", Toast.LENGTH_SHORT).show();
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...