【发布时间】:2017-09-26 10:33:03
【问题描述】:
我正在尝试执行一些基本的 Firebase 操作,但是 childEventListener 的行为不符合预期。
我有一个餐厅订单列表,我使用 Firebase 查询和 ChildEventListener 将其显示在列表中。该查询用于获取所有未煮熟的订单,即 WHEREcooked = false。
FirebaseDatabase mFirebaseDatabase = FirebaseDatabase.getInstance();
mDatabaseReference = mFirebaseDatabase.getReference().child(UUID + "/" + outletID + "/orders");
Query query = mDatabaseReference.orderByChild("cooked").equalTo(false);
mChildEventListener = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Log.e(TAG, "ChildEventListener() - onChildAdded - " + dataSnapshot.getKey());
Order order = dataSnapshot.getValue(Order.class);
mAdapter.addOrder(order);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
Log.e(TAG, "ChildEventListener() - onChildChanged - " + dataSnapshot.getKey());
Order order = dataSnapshot.getValue(Order.class);
mAdapter.updateOrder(order);
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
Log.e(TAG, "ChildEventListener() - onChildRemoved - " + dataSnapshot.getKey() + ", exist - " + dataSnapshot.exists());
Order order = dataSnapshot.getValue(Order.class);
mAdapter.removeOrder(order);
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
Log.e(TAG, "ChildEventListener() - onChildMoved - " + dataSnapshot.getKey());
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.w(TAG, "ChildEventListener : onCancelled - ", databaseError.toException());
}
};
query.addChildEventListener(mChildEventListener);
这很好用,它可以提取正确的数据。
我有另一个列表,其中包含所有已煮熟的订单,即 WHEREcooked = true。我为此使用一次性事件侦听器并按预期显示正确的数据。
Query query = mDatabaseReference.orderByChild("cooked").equalTo(true);
在我的熟订单列表中,当用户点击订单时,意味着将熟标志更新回“false”并出现在未熟订单列表中。使用以下 setValue() 方法完成。
mDatabaseReference.child(order.getPushID()).child("cooked").setValue(false);
问题 1
当我加载活动并且没有未煮熟的订单时,这就是问题发生的地方。当我点击一个熟订单时,Firebase 数据库按预期更新熟标志,但是 onChildAdded() 按预期调用,但订单对象数据为空。之后,我还使用订单对象数据进行了 onChildChanged 调用。
当我继续点击煮熟的订单时,它会按预期使用正确的数据调用一次 onChildAdded()。所以从技术上讲,我错过了由于空数据而被烹制的第一个订单。
如果我加载具有 1 个或多个未烹饪订单的活动并点击已烹饪订单,则 onChildAdded() 会按预期调用并更新未烹饪订单列表。
我尝试将 setValue() 更改为 updateChildren() 但结果仍然相同。
【问题讨论】:
-
我也遇到过类似的问题:stackoverflow.com/questions/51808339/…
标签: android firebase firebase-realtime-database