如何修改Firebase中的特定值?

时间:2017-05-10 00:58:13

标签: android firebase reference firebase-realtime-database

我在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 问候!

4 个答案:

答案 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) {}
});

其中negociosIdpush()方法生成的唯一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) {}
});