繁体   English   中英

如何从 firebase 实时数据库获取特定值。类似于 sql 中的 where 子句

[英]How to get specific values from firebase realtime database.Similar to a where clause in sql

我对android和firebase有点陌生,但我需要从我的firebase实时数据库中获取一些值,类似于sql中的select stmt(从All_machines中选择地址,名称,其中terminal_id =“terminal_id”)。 当我执行下面的代码时,我得到了一个空指针异常。 但我想我还没有理解这个概念。

mDatabase = FirebaseDatabase.getInstance().getReference("All Machines");
mDatabase.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        try {
            for (DataSnapshot childDataSnapshot : dataSnapshot.getChildren()) {
                if (childDataSnapshot.getValue() != null){
                    try {
                        if (childDataSnapshot.child("terminal_id").getValue().toString().equals(newTerminal_id)){
                            String Terminal_address= ""+ childDataSnapshot.child("address").getValue();
                            String Terminal_name = ""+ childDataSnapshot.child("terminal_name").getValue();
                            terminal_name.setText(Terminal_name);
                            terminal_address.setText(Terminal_address);
                        }
                        else {
                            Toast.makeText(getApplicationContext(),"No Entry matching barcode",Toast.LENGTH_LONG).show();
                        }
                        //Log.v(TAG,""+ childDataSnapshot.child("terminal_name").getValue());   //gives the value for given keyname
                    }catch (Exception e){
                        Toast.makeText(getApplicationContext(),e.getMessage(),Toast.LENGTH_LONG).show();
                    }
                }else{
                    Toast.makeText(getApplicationContext(),"It's null.",Toast.LENGTH_LONG).show();
                }
                //Log.v(TAG,""+ childDataSnapshot.getKey()); //displays the key for the node
                //get the terminal id for each child then check if it matches the scanned barcode

            }

        }catch (Exception e){
            Toast.makeText(getApplicationContext(),e.getMessage(),Toast.LENGTH_LONG).show();
        }

    }

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

    }
});

数据库结构:

{
  "All Machines": {
    "-M-JnXkserObKnDj3iZO": {
      "address": "OANDO IDIROKO",
      "atmClass": "6627",
      "bankName": "SPL",
      "brand": "NCR",
      "id": "-M-JnXkserObKnDj3iZO",
      "ip": "1033944",
      "latitude": "10333",
      "longitude": "10333",
      "serial_no": "13528891",
      "terminal_Id": "10332368",
      "terminal_name": "ATM9"
    }
  }
}

您可以使用orderByChildequalTo方法来过滤服务器端的数据,如下所示:

// Get DatabaseReference for All Machines
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("All Machines");

// Use orderByChild to order data by terminal_Id and use equalTo for filter by newTerminal_id
Query query = databaseReference.orderByChild("terminal_Id").equalTo(newTerminal_id);

query.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for(DataSnapshot childSnapshot: dataSnapshot.getChildren()) {

            String Terminal_address= childSnapshot.child("address").getValue(String.class);
            String Terminal_name = childSnapshot.child("terminal_name").getValue(String.class);

            terminal_name.setText(Terminal_name);
            terminal_address.setText(Terminal_address);
        }
    }

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

    }
});

输出:如果terminal_Id等于10332368 ,则

Terminal_address = "OANDO IDIROKO";
Terminal_name = "ATM9";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM