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

Java 如何在Android中将Firebase子节点从一个节点移动到另一个节点?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在从事一个项目,在该项目中,用户请求我们的代客服务,而代客服务的另一端则接受用户的请求 我使用Firebase作为后端,并根据请求将客户uid保存在“请求”子级 当代客泊车员接受请求时,客户uid应从“请求”节点移动到“进行中”节点 我如何才能做到这一点?我建议使用以下方法: public void moveFirebaseRecord(Firebase fromPath, final Firebase toPath) { fromPath.addListenerForSingleV

我正在从事一个项目,在该项目中,用户请求我们的代客服务,而代客服务的另一端则接受用户的请求

我使用Firebase作为后端,并根据请求将客户uid保存在“请求”子级

当代客泊车员接受请求时,客户uid应从“请求”节点移动到“进行中”节点


我如何才能做到这一点?

我建议使用以下方法:

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");
        }
    });
}
这来自以下来源:。我在JavaEE代码和android应用程序中多次使用它


你通过你的fromPath和toPath。这是复制而不是移动,所以原作也将保留在原处。如果要删除,可以在System.out.println(“Success”);之后的fromPath上设置一个值

自编译firebase数据库:11.0.1起,这与新类引用的功能相同(2017年7月5日)


如果要执行同时删除原始文件的移动,可以使用以下代码段:

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

您可以侦听要复制的子项上的值事件、、和#onDataChange获取新子项的引用并将值dataSnapshot设置为此子项,如下面的示例代码所示

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

                }
            });

它工作正常,但它使用firebase url作为路径(ref)并移动所有子对象。我只想移动一个选中的子对象。如何只移动一个孩子。t如果您有孩子的ID,则可以直接从一个ID移动到另一个ID。它将是:myfirebase.firebase.com/initialPlace/ID到myfirebase.firebase.com/finalPlace/ID。您可以将任何字符串作为变量传递给firebase构造函数。key的值是多少?在javascript对象中,“key”是与非空值关联的任何属性名。“fromPath”将是指向该键的对象分支,“toPath”将是指向该键的对象分支。例如:
{user1:{name:'Jack',address:{line1:'some st',}}}
如果您想在这里移动的是地址,那么键是“address”,fromPath是“/user1/”,toPath是“/junkAddress/user1/”该键也可以是按键。如何获取“key”的值,以便在删除内容时使用。基本上,当我调用removeFromFirebase(fromPath,toPath,key)方法时,我如何获取key的值?您只需要执行
toPath.child(key).addListenerForSingleValueEvent(/***/)
从新路径检索相同的值。在这种情况下,如果存在并发移动操作,则相同的代码可能会运行多次。所以你是对的。使用事务还可以简化代码。您只需要从该回调返回null。问题是,在这种情况下,内部集合操作不能失败,否则需要同步运行它。因为,如果是这样的话,你会失去最初的价值。
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) {

                }
            });