【问题标题】:How to retrive the push key value and update child values of key value如何检索推送键值并更新键值的子值
【发布时间】:2019-01-11 09:45:35
【问题描述】:

大家好

我正在使用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");

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

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案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);
    

    【讨论】:

    • Alex 谢谢它的工作......还有一个问题如果卖家名等于 sagar,如何删除整个密钥??
    • 不客气@redface!只需使用ds.child("sellername").getRef().getParent().removeValue();。干杯!
    • 我意识到这不能解决我的问题,我有一个包含每个唯一 ID 的数据列表,只想更改 someid 的卖家名称,而不是全部,这需要我获取密钥并更改卖家名称的值仅在该键中,不是全部。并且还想删除相同的键而不是全部。
    • 在这种情况下,请参阅我的回答 this。所以在代码中应该是这样的:rootRef.child("books").child("Classical Mechanics").child("LVmsTmBZ_kCdcXlZh7e").addListenerForSingleValueEvent(/* ... */) 不需要循环,对吧?
    • 我应该在 addListenerForSingleValueEvent(/* ... */);我真的很抱歉,但我是 firebase 的新手,我学到的一切都是从谷歌搜索中学到的,所以不知道如何继续...... .
    猜你喜欢
    • 2020-06-28
    • 2012-05-15
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    相关资源
    最近更新 更多