如何在Android中查询Firebase数据库

时间:2018-12-09 10:06:57

标签: android firebase firebase-realtime-database

我对Android Studio Firebase数据库有疑问。我目前正在尝试为查询添加条件,以便为选定的查询发送通知,在本例中,是在我的Firebase数据库中选择的send notification if MenuId=01,希望对您有所帮助。

    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 :(得分:0)

  

您无需放置条件即可使用   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();
        }
}

答案 1 :(得分:0)

无论是否有结果,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();
          }
        }