如何获取推键值和更新键值的子值

时间:2019-01-11 09:45:36

标签: java android firebase firebase-realtime-database

enter image description here大家好

我正在使用push方法在实时Firebase数据库上添加数据。现在,我想从应用程序中检索sellername并更新新的sellername,并将更改也保存在Firebase数据库中。

我该怎么做?

我正在使用以下代码,但是每次都随机获得不同的键值 而不是-LVmsTmBZ_kCdcXlZh7e

    FirebaseDatabase mFirebaseDatabase = FirebaseDatabase.getInstance();
   DatabaseReference ref =          mFirebaseDatabase.getReference().child("books").child("Classical Mechanics");

String key = ref.push().getKey();

          Toast.makeText(book_details.this, key, Toast.LENGTH_SHORT).show();

然后我正在使用:

                  FirebaseDatabase.getInstance().getReference()
.child("books")
.child(Classical Mechanics)
.child(key)
.child("sellername")
.setValue("newvalue");

它给了我空错误,这是预期的结果,因为我得到的是随机键值而不是单个常量。

1 个答案:

答案 0 :(得分:1)

  

我正在使用以下代码,但是每次都随机获得不同的键值   而不是-LVmsTmBZ_kCdcXlZh7e

之所以会这样,是因为每次您使用push()方法时,都会生成一个全新的ID。

因此,如果要访问特定的对象,则必须知道一些可以唯一标识这些对象的知识。在这种情况下,如果要更改sellername属性的值,则应使用如下查询:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference classicalMechanicsRef = rootRef.child("books").child("Classical Mechanics");
Query query = classicalMechanicsRef.orderByChild("sellername").equalTo("sagar");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            ds.child("sellername").getRef().setValue("newvalue");
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
query.addListenerForSingleValueEvent(valueEventListener);

使用此代码,您将在所有对象中更改卖方的名称,这很有意义,因为新名称必须存在于所有对象中。

编辑:更简单地更新/删除单个对象下的数据。为此,请使用以下代码行:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference classicalMechanicsRef = rootRef.child("books").child("Classical Mechanics").child("-LVmsTmBZ_kCdcXlZh7e");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        dataSnapshot.child("sellername").getRef().setValue("newvalue");
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
classicalMechanicsRef.addListenerForSingleValueEvent(valueEventListener);