I have an Order
node and a Status
key under that. I am looking for changes in the Status
’s value and if there’s any change detected, I have to read
the parent Order
Node.
The key point is I do not want to listen to changes in the Order
node. But just the Status
under the Order
node. What is the most optimum way to do this? Is it good to have a listener inside another listener? Here's my code:
final Query qRef = FirebaseDatabase.getInstance().getReference().child("orders").orderByChild("customerId").equalTo(FirebaseAuth.getInstance().getCurrentUser().getUid())
.limitToFirst(1);
qRef.keepSynced(true);
final DatabaseReference reference = qRef.getRef().child("status");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
DatabaseReference inner = reference.getParent();
inner.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot parent) {
if (parent != null) {
Order newOrder = parent.getValue(Order.class);
if (newOrder != null) {
if (newOrder.getStatus() != null && !newOrder.getStatus().equals("FX_OVER"))
processOrder(newOrder);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
And the JSON:
{ "20161010210955" : {
"createdAt" : {
"date" : 10,
"day" : 1,
"hours" : 21,
"minutes" : 9,
"month" : 9,
"seconds" : 55,
"time" : 1476113995244,
"timezoneOffset" : -330,
"year" : 116
},
"customerId" : "npsd3Ldfsdf1x0hsdfsdf2mj14VUA876f2",
"id" : "20161010210955",
"status" : "FX_FULL"
} }
Why don't you check status first? You know the value of status at beginning. I think this solution should be optimum way.
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if("FX_OVER".equals(dataSnapshot.getValue(String.class)) {
reference.getParent().addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot parent) {
// This is a defensive check. I dont know this is necessary.
// If status exist, parent must be exist.
if (parent.exists()) {
Order newOrder = parent.getValue(Order.class);
if (newOrder != null) {
processOrder(newOrder);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With