如何使用Android锁定Firebase数据库中的计数器,直到ListView中的项目消失?
我已经创建了一个列表,其中显示了一些产品。该列表可以与多个用户共享。列表中有一个名为如何使用Android锁定Firebase数据库中的计数器,直到ListView中的项目消失?,android,listview,firebase,firebase-realtime-database,Android,Listview,Firebase,Firebase Realtime Database,我已经创建了一个列表,其中显示了一些产品。该列表可以与多个用户共享。列表中有一个名为numberOfProducts的字段。每次将产品添加到列表中时,计数器都会增加一个。每次删除产品时,计数器都会减少一个。要显示列表中的产品,我使用ListView和FirebaseListAdapter。如果列表显示在两个不同的设备上,当用户删除产品时,该项目将从其设备的列表视图中消失,计数器将减少一个 我的问题是,在第二台设备上,该项目在半秒后消失。在此短时间内,如果第二个用户尝试删除同一产品,计数器将再次减
numberOfProducts
的字段。每次将产品添加到列表中时,计数器都会增加一个。每次删除产品时,计数器都会减少一个。要显示列表中的产品,我使用ListView
和FirebaseListAdapter
。如果列表显示在两个不同的设备上,当用户删除产品时,该项目将从其设备的列表视图中消失,计数器将减少一个
我的问题是,在第二台设备上,该项目在半秒后消失。在此短时间内,如果第二个用户尝试删除同一产品,计数器将再次减少。因此,不是移除一项,而是将计数器减少两项
我的问题是,如何锁定numberOfProducts
计数器,直到第二台设备的项目消失后才能写入
减少计数器的代码如下所示:
void decreaseCounter(String listKey) {
final DatabaseReference ref = listsDatabaseReference.child(listKey).child("numberOfProducts");
ref.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(final MutableData currentData) {
if (currentData.getValue() == null) {
currentData.setValue(0);
} else {
int numberOfProducts = currentData.getValue();
int decreasedNumberOfProducts = numberOfProducts - 1;
currentData.setValue(decreasedNumberOfProducts);
}
return Transaction.success(currentData);
}
@Override
public void onComplete(DatabaseError databaseError, boolean committed, DataSnapshot currentData) {
if (databaseError != null) {
System.out.println("Firebase counter increment failed!");
} else {
System.out.println("Firebase counter increment succeeded!");
}
}
});
}
提前谢谢 您应该使用Firebase事务处理删除操作在哪里进行?因为这是bug的来源,所以您可能需要将其包括在内,以便在这里获得真正的帮助。见和。一种想法是使用函数进行递减,而不是依赖于客户端。但您可能也只希望在事务中删除。或者,您可能只想检查当前计数器值是否与本地计数器值匹配,并在更改后中止更改。