Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to move Firebase child from one node to another in Android?

I am working on a project where user request for our valet services and on the other end valet accepts request.

I am using using Firebase as backend and on request customer uid is save on 'request' child.

When valet accepts request, customer uid should move from 'request' node to 'on progress' node.

How can i do that?

like image 895
Shakeel Dhada Avatar asked Nov 07 '16 01:11

Shakeel Dhada


3 Answers

I recommend using this :

public void moveFirebaseRecord(Firebase fromPath, final Firebase toPath)
{
    fromPath.addListenerForSingleValueEvent(new ValueEventListener()
    {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot)
        {
            toPath.setValue(dataSnapshot.getValue(), new Firebase.CompletionListener()
            {
                @Override
                public void onComplete(FirebaseError firebaseError, Firebase firebase)
                {
                    if (firebaseError != null)
                    {
                        System.out.println("Copy failed");
                    }
                    else
                    {
                        System.out.println("Success");
                    }
                }
            });
        }

        @Override
        public void onCancelled(FirebaseError firebaseError)
        {
            System.out.println("Copy failed");
        }
    });
}

This come from this source : https://gist.github.com/katowulf/6099042 . I used it several times in my JavaEE code and also in my android app.

You pass your fromPath and toPath. This is a copy tought and not a move, so the original will remain at his original place too. If you would like to delete, you can do a set value on the fromPath just after the System.out.println("Success"); .

like image 171
Ali Haidar Avatar answered Oct 15 '22 02:10

Ali Haidar


As of compile firebase-database:11.0.1, this is the same function with the new class references (https://firebase.google.com/support/guides/firebase-android July 05 2017)

private void moveGameRoom(final DatabaseReference fromPath, final DatabaseReference toPath) {
        fromPath.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                toPath.setValue(dataSnapshot.getValue(), new DatabaseReference.CompletionListener() {
                    @Override
                    public void onComplete(DatabaseError firebaseError, DatabaseReference firebase) {
                        if (firebaseError != null) {
                            System.out.println("Copy failed");
                        } else {
                            System.out.println("Success");

                        }
                    }
                });

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }
like image 9
Mathoa Avatar answered Oct 15 '22 01:10

Mathoa


If you want to perform a move which also erases the original, you might make use of the following snippet:

// In this piece of code, "fromPath" and "toPath" parameters act like directories.
private void removeFromFirebase(final DatabaseReference fromPath, final DatabaseReference toPath, final String key) {
    fromPath.child(key).addListenerForSingleValueEvent(new ValueEventListener() {
        // Now "DataSnapshot" holds the key and the value at the "fromPath".
        // Let's move it to the "toPath". This operation duplicates the
        // key/value pair at the "fromPath" to the "toPath".
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            toPath.child(dataSnapshot.getKey())
                    .setValue(dataSnapshot.getValue(), new DatabaseReference.CompletionListener() {
                        @Override
                        public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
                            if (databaseError == null) {
                                Log.i(TAG, "onComplete: success");
                                // In order to complete the move, we are going to erase
                                // the original copy by assigning null as its value.
                                fromPath.child(key).setValue(null);
                            }
                            else {
                                Log.e(TAG, "onComplete: failure:" + databaseError.getMessage() + ": "
                                        + databaseError.getDetails());
                            }
                        }
                    });
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.e(TAG, "onCancelled: " + databaseError.getMessage() + ": "
                    + databaseError.getDetails());
        }
    });
}
like image 3
felixy Avatar answered Oct 15 '22 02:10

felixy