首页 > 解决方案 > 是否可以在按钮单击时从 android 更新特定子项的值而无需 ID 或 firebase 实时数据库中的键?

问题描述

这是我的数据库,现在我需要将喜爱的值从 0 更改为 1,但我没有任何特定的 id,所以如何在 android 中更改特定子项的值!

[enter image description here][1]

标签: androidfirebase-realtime-database

解决方案


为了更新节点,您必须知道该节点的完整路径。

Firebase 不支持更新查询的概念,您可以在其中将条件传递给更新语句。因此,如果您不知道完整路径,则必须采取两步方法:

  1. 执行查询以查找要更新的节点。
  2. 更新每个节点。

例如,假设该Name属性标识您要更新的节点,您可以这样做:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference("Cameras");
Query query = ref.orderByChild("Name").equalTo("TheNameOfTheNodeYouWantToUpdate");
query.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot cameraSnapshot: dataSnapshot.getChildren()) {
            cameraSnapshot.getReference().child("Favorite").set(1);
        }
    }

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

鉴于您正在更新上面的计数器,您实际上可能希望在其中使用事务onDataChange

DatabaseReference favRef = cameraSnapshot.getReference().child("Favorite");

favRef.runTransaction(new Transaction.Handler() {
    @Override
    public Transaction.Result doTransaction(MutableData mutableData) {
        Integer currentValue = mutableData.getValue(Integer.class);
        if (currentValue == null) {
            mutableData.setValue(1);
        } else {
            mutableData.setValue(currentValue + 1);
        }

        return Transaction.success(mutableData);
    }

    @Override
    public void onComplete(DatabaseError databaseError, boolean b,
                           DataSnapshot dataSnapshot) {
        // Transaction completed
        Log.d(TAG, "transaction:onComplete:" + databaseError);
    }
});


推荐阅读