我在Firebase数据库中有这些数据:
Negocios:
-KjfCu56lFZCybYldBZy
lugarReference: "Restaurante"
numeroMesas:39
password:"pass123"
user:"user123"
user_id:"usr_1"
我有两个应用程序连接到Firebase中的一个项目,其中一个上传了餐馆预订的数据,另一个在RecyclerView中显示预订。
在第一个应用程序中,一旦我进行预订,它必须减去一到numeroMesas
值,另一个应用程序应显示对此密钥的任何更改。
在预订申请中,我有这段代码,我在这个问题中做了一些代码:
Update specific keys using Firebase for Android
它假设要修改numeroMesas
的值,但它不会:
mReference.child("Negocios").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot postSnapshot : dataSnapshot.getChildren()){
Lugar lugar = postSnapshot.getValue(Lugar.class);
if(nombre_lugar.equals(lugar.getUser_id())){
DatabaseReference numMesasReference = mReference.child(dataSnapshot.getKey()).child("numeroMesas");
numMesasReference.setValue(lugar.getNumeroMesas() - 1);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
它的作用是下一件事:
Negocios:
-KjfCu56lFZCybYldBZy
lugarReference: "Restaurante"
numeroMesas:39
password:"pass123"
user:"user123"
user_id:"usr_1"
-Negocios
-KjfCu56lFZCybYldBZy
numeroMesas:39
如何修复? 一旦我做了预订,我需要减1 问候!
答案 0 :(得分:2)
我猜问题是这行中的dataSnapshot.getKey()
DatabaseReference numMesasReference = mReference.child(dataSnapshot.getKey()).child("numeroMesas");
在这里你获得整个Negocios列表的密钥,而不是特定的孩子用`
替换它postSnapshot.getKey()
答案 1 :(得分:1)
使用postSnapshot.getRef()
获取对此快照的源位置的引用。那么接下来要将一个孩子添加到该引用中,该引用将是" numeroMesas"这是你想要修改的密钥。
就这么简单,代码将是这样的。
mReference.child("Negocios").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot postSnapshot : dataSnapshot.getChildren()){
Lugar lugar = postSnapshot.getValue(Lugar.class);
if(nombre_lugar.equals(lugar.getUser_id())){
DatabaseReference numMesasReference = postSnapshot.getRef().child("numeroMesas");
numMesasReference.setValue(lugar.getNumeroMesas() - 1);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
P.S:如果您想通过预订减去一次,addValueEventListener()
无法工作,它将减去多次作为循环。使用addListenerForSingleValueEvent()
代替addValueEventListener()
。
顾名思义,这个监听器适合任何位置数据的单个更改。
答案 2 :(得分:0)
问题在于您使用的DatabaseReference
是错误的。你错过了一个孩子。因此,为了解决这个问题,请使用以下代码:
mReference.child("Negocios").child(negociosId).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
int numeroMesas = (int) dataSnapshot.child("numeroMesas").getValue();
if(nombre_lugar.equals(lugar.getUser_id())){
mReference.child("Negocios").child(negociosId).child("numeroMesas").setValue(numeroMesas - 1);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
其中negociosId
是push()
方法生成的唯一ID。
希望它有所帮助。
答案 3 :(得分:0)
我是firebase和android的新手。但如果上述解决方案无效,请执行以下操作。我认为问题是你没有将numeroMesas的值转换为字符串。对不起,如果有什么不对的话。 希望它有所帮助。
mReference.child("Negocios").child(negociosId).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(nombre_lugar.equals(lugar.getUser_id())){
mReference.child("Negocios").child(negociosId).child("numeroMesas").setValue((Integer.parseInt(dataSnapshot.child("numeroMesas").getValue().toString())) - 1);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});