gpt4 book ai didi

android - Firebase onChildAdded 返回空数据,然后在更新子项后返回 onChildChanged

转载 作者:行者123 更新时间:2023-11-29 16:51:05 25 4
gpt4 key购买 nike

我正在尝试执行一些基本的 Firebase 操作,但是 childEventListener 的行为不符合预期。

我有一个餐厅订单列表,我使用 Firebase 查询和 ChildEventListener 将其显示在列表中。该查询用于获取所有未煮熟的订单,即 WHERE cooked = 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);

这工作正常,它提取了正确的数据。

我有另一个列表,其中包含所有已煮熟的订单,即 WHERE cooked = true。我为此使用一次性事件监听器并按预期显示正确的数据。

Query query = mDatabaseReference.orderByChild("cooked").equalTo(true);

在我的熟食订单列表中,当用户点击订单时,意味着将熟食标志更新回“false”并出现在未熟食订单列表中。这是使用以下 setValue() 方法完成的。

mDatabaseReference.child(order.getPushID()).child("cooked").setValue(false);

问题 1

当我加载 Activity 并且没有未煮熟的订单时,这就是问题发生的地方。当我点击熟食订单时,Firebase 数据库按预期更新熟食标志,但按预期调用了 onChildAdded(),但订单对象数据为空。之后,我还收到了带有订单对象数据的 onChildChanged 调用。

当我继续点击熟食订单时,它会按预期使用正确的数据调用 onChildAdded() 一次。所以从技术上讲,我错过了由于空数据而煮熟的第一个订单。

如果我加载具有 1 个或多个未煮熟订单的 Activity ,然后点击一个煮熟订单,将按预期调用 onChildAdded() 并更新未煮熟订单列表。

我尝试将 setValue() 更改为 updateChildren() 但结果仍然相同。

最佳答案

通常,当您使用多个 setValue 操作为一个对象编写多个属性时,Firebase 会重现此类问题。我建议以下场景:

  1. 订单被添加到 \orders,调用了 onChildAdded,但这是空的,因为它的 cooked 属性是 false
  2. Cooked 属性设置为 falseonChildUpdated 按您需要的顺序调用。

也许这不是您所做的,而是它在幕后的实现方式。也许您可以只使用 onChildUpdated

关于android - Firebase onChildAdded 返回空数据,然后在更新子项后返回 onChildChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46424055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com