crixus
crixus

Reputation: 33

How can I change the value of child in Firebase database?

I want to change the value of child "toggleStatus" under Reference "BetSlip" as shown below. The already set value is "on" so I want such that when I click the button the value of "toggleStatus" is changed to "off"

BetSlipActivity.toggleCollapse.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String timeStamp = betSlip.get(position).getTimeStamp();
        String toggleStatus = betSlip.get(position).getToggleStatus();
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("BetSlip");
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                for (DataSnapshot ds: snapshot.getChildren()) {
                    String timestamp = ""+ ds.child("timeStamp").getValue();
                    String toggleStatus = ""+ ds.child("toggleStatus").getValue();
                    if (timeStamp.equals(timestamp) && toggleStatus.equals("on")) {
                        //set value to off
                    }
                    if (timeStamp.equals(timestamp) && toggleStatus.equals("off")) {
                        //set value to on
                    }
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
    }
});

This is how the database looks like

Upvotes: 1

Views: 744

Answers (1)

Frank van Puffelen
Frank van Puffelen

Reputation: 598827

If you've got the DataSnapshot for a path in the database, it's easy to get the DatabaseReference that you need to update it:

DatabaseReference reference = FirebaseDatabase.getInstance().getReference("BetSlip");
reference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        for (DataSnapshot ds: snapshot.getChildren()) {
            String timestamp = ""+ ds.child("timeStamp").getValue();
            String toggleStatus = ""+ ds.child("toggleStatus").getValue();
            if (timeStamp.equals(timestamp) && toggleStatus.equals("on")) {
                ds.child("toggleStatus").getRef().setValue("off");
            }
            if (timeStamp.equals(timestamp) && toggleStatus.equals("off")) {
                ds.child("toggleStatus").getRef().setValue("on");
            }
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        throw error.toException(); // never ignore errors
    }
});

Since you're updating the node based on its existing value, strictly speaking you might need to use a transaction for it.

Upvotes: 1

Related Questions