【问题标题】:Update value of key in Firebase更新 Firebase 中键的值
【发布时间】:2016-12-02 17:36:44
【问题描述】:

在以 web 和 android 作为客户端的 Firebase 应用程序中拥有 Firebase 实时数据库。使用push() 方法将值插入数据库,该方法生成随机键,并且所有子键值对由Web 客户端存储在子项中。现在,我想通过 android 更新特定子项的一些键值对。例如

KHSIHJKJBNJXKCB -
     name="xyz"
     age=19
JHGISFUSHFIJDSF -
     name="abc"
     age=20

如何更新特定键的“年龄”属性,不使用键 KJHUJHDFIUSH 等,就像将年龄更新为 25,其中名称为“abc”。

更新

其中“学生 0”被 Firabase 生成的一些随机值替换。所以我想将值“isCertificateReady”更改为 false。如何在不知道节点密钥的情况下引用特定节点。在本例中,我们可以使用联系电话作为唯一 ID。

我用来解决问题或得到答案的代码

coachingDatabaseReference.orderByChild("contactNumber")
    .equalTo(contactNumber)
    .addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String key = dataSnapshot.getKey();

            coachingDatabaseReference.child(key)
                .child("isCertificateReady")
                .setValue(false);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    为此,您必须使用查询
    就像在 Android 中一样
    myRef.orderByChild("age").equalTo("20").addListenerForSingleValueEvent(...
    Query

    然后您可以使用datasnapshot.getKey() 调用它的key 然后更新值
    Update Specific Keys

    【讨论】:

    • 我拿不到钥匙。 Listener 永远不会接到任何电话。因为实际上没有值变化所以监听器不会得到任何调用。
    • @DushyantSuthar 你做得对吗?堆栈上有大量的解决方案可供查看。你能用代码展示你的实现吗?
    • @DushyantSuthar 如果没有当前值,将使用空/null 快照调用 value 侦听器。如果这对您不起作用,请分享minimal code that reproduces the problem
    • n 每次启动活动或任何代码时都会调用它。
    • @FrankvanPuffelen 我添加了更多内容。我希望我会工作。感谢您考虑。
    【解决方案2】:

    如果名称不是唯一的,请为您的学生对象添加一些唯一的 ID。 如果我们假设名称是唯一的,那么运行事务并更新内部的特定值是安全的,如下所示。

    myRef.orderByChild("name").equalTo("abc").runTransaction(new Transaction.Handler() {
        @Override
        public Transaction.Result doTransaction(MutableData mutableData) {
            Student s = mutableData.getValue(Student.class);
            if (s == null) {
                return Transaction.success(mutableData);
            }
    
            s.setAge(20);
            // Set value and report transaction success
            mutableData.setValue(s);
            return Transaction.success(mutableData);
        }
    
        @Override
        public void onComplete(DatabaseError databaseError, boolean b,
                               DataSnapshot dataSnapshot) {
            // Transaction completed
            Log.d(TAG, "postTransaction:onComplete:" + databaseError);
        }
    });
    

    【讨论】:

      猜你喜欢
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多