无法一次从节点“历史记录”中获取一个密钥

时间:2018-07-27 16:59:37

标签: java android firebase firebase-realtime-database

{
  "History" : {
    "-LIRZ4Nf2HyTTYtZEeOA" : {
      "destination" : "101 Main Street, Your Town, Your Country",
      "driver" : "vP9r4F2yDWRRuvKjRiQvMEXVuoK2",
      "payment response" : "approved",
      "rating" : 0,
      "ridePrice" : 3.63,
      "rider" : "C0RjB5NPZcTvWz9XiUAhpTDOK0C2",
      "status" : "accepted",
      "timestamp" : 1532709012
    }
  }

以上是Firebase数据库中的“历史记录”节点。

我的最终目标是在付款响应=“已批准” 后发送警报对话框,但是在这种情况下,如果“历史记录”节点中有多个键,则警报会在顶部运行彼此。

我该怎么办,这样不会发生?

我用来获取每个“历史记录”条目密钥的代码是:

private void getPaymentResponse() {
    final DatabaseReference paymentConfirmed = FirebaseDatabase.getInstance().getReference("History");
    paymentConfirmed.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                ryydeKey = ds.getKey(); **<-- gets the key**

                DatabaseReference response = FirebaseDatabase.getInstance().getReference("History")
                        .child(ryydeKey);
                response.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        for (DataSnapshot child : dataSnapshot.getChildren()) {
                            if (child.getKey().equals("payment response")) {
                                String response = String.valueOf(child.getValue().toString());
                                if (response.equals("approved")) {
                                    proceedToPickupDialog();
                                }
                            }

                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {}
                });
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

我假设代码是

 for(DataSnapshot ds : dataSnapshot.getChildren()) {
     ryydeKey = ds.getKey();

正在获取所有密钥,但是我想要的只是当前密钥。

编辑

我正在输入此代码,没有任何内容。尝试过的原木和吐司。

DatabaseReference payRef = FirebaseDatabase.getInstance().getReference();
    Query query = payRef.child("History").orderByChild("driver").equalTo(driverId).limitToLast(1);
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                String response = ds.child("payment response").getValue(String.class);
                Log.e(TAG, "response = " + response);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {}
    };

    query.addListenerForSingleValueEvent(valueEventListener);

1 个答案:

答案 0 :(得分:2)

使用getChildren()方法时,这意味着您正在遍历整个DataSnapshot对象。如果DataSnapshot包含一个以上的子级,则警报将在彼此之上运行。如果您只想检查一个特定的孩子,则需要稍微更改一下代码。

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference idRef = rootRef.child("History").child("-LIRZ4Nf2HyTTYtZEeOA");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String response = dataSnapshot.child("payment response").getValue(String.class);
        if(response.equalTo("approved")) {
            Log.d("TAG", "Payment approved!");
        } else {
            Log.d("TAG", "Payment not approved!");
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
idRef.addListenerForSingleValueEvent(valueEventListener);

使用此代码,您只能从一个孩子那里得到答复。要真正完成这项工作,首先您需要将此值-LIRZ4Nf2HyTTYtZEeOA存储在变量中,以便能够在您的引用中使用。

编辑:这是使用查询的另一种方法”

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("History").orderByChild("driver").equalsTo(driverId).limitToLast(1);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String response = dataSnapshot.child("payment response").getValue(String.class);
            if(response.equalTo("approved")) {
                Log.d("TAG", "Payment approved!");
            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
query.addListenerForSingleValueEvent(valueEventListener);