如何在Android中将Firebase子项从一个节点移动到另一个节点?

时间:2016-11-07 01:10:34

标签: java android firebase firebase-realtime-database

我正在开展一个项目,用户请求我们的代客服务,另一方面代客接受请求。

我正在使用Firebase作为后端,并根据要求将客户uid保存在“请求”的孩子身上。

当代客接受请求时,客户uid应该从“请求”节点移动到“正在进行”节点。

我该怎么做?

4 个答案:

答案 0 :(得分:5)

我建议使用它:

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");
        }
    });
}

这来自这个来源:https://gist.github.com/katowulf/6099042。我在我的JavaEE代码和Android应用程序中多次使用它。

您传递了fromPath和toPath。这是一个复制品而不是一个动作,因此原件也将保留在原来的位置。如果你想删除,你可以在System.out.println之后的fromPath上设置一个值(" Success");

答案 1 :(得分:5)

从编译firebase-database:11.0.1开始,这与新类引用相同(https://firebase.google.com/support/guides/firebase-android 2017年7月5日)

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) {

            }
        });
    }

答案 2 :(得分:2)

如果您要执行同样删除原始内容的移动,则可以使用以下代码段:

// 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());
        }
    });
}

答案 3 :(得分:0)

您可以在要复制它的孩子上监听value事件,然后#onDataChange获取新孩子的引用并为该孩子设置valuedataSnapshot,如下例代码所示

FirebaseDatabase.getInstance().getReference("childYouWantToCopy")
                    .addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    FirebaseDatabase.getInstance().getReference("ChildCopyTo").setValue(dataSnapshot.getValue());
                }

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

                }
            });