将具有多个子节点的 Firebase 节点复制到另一个节点

Sar*_*wal 5 android firebase firebase-realtime-database

嘿嘿 我想把有多个子节点的子节点里面的数据复制到别的地方。

数据库

在上图中,我想将问题节点内的数据传输到用户的 uid 节点中。

在问题节点值中,我有两个字段,即正确答案和图像 url。

我已经尝试了以下

public void copyFirebaseData() {
    DatabaseReference questionNodes = FirebaseDatabase.getInstance().getReference().child("questions");
    final DatabaseReference toUsersQuestions = FirebaseDatabase.getInstance().getReference().child("users").child(uid).child("questions");

    questionNodes.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            toUsersQuestions.setValue(dataSnapshot.getValue(), new Firebase.CompletionListener() { //getting error in this line
                @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(DatabaseError databaseError) {

        }
    });
}`
Run Code Online (Sandbox Code Playgroud)

但这会引发异常

02-24 13:47:09.085 7757-7757/curieo.android.zenmaster E/AndroidRuntime: FATAL EXCEPTION: main
                                                                    Process: curieo.android.zenmaster, PID: 7757
                                                                    com.google.firebase.database.DatabaseException: Failed to parse node with class class curieo.android.zenmaster.mainfragments.HomeFragment$11$1
                                                                        at com.google.android.gms.internal.zzbpf.zza(Unknown Source)
                                                                        at com.google.android.gms.internal.zzbpf.zzar(Unknown Source)
                                                                        at com.google.android.gms.internal.zzbpi.zzas(Unknown Source)
                                                                        at com.google.firebase.database.DatabaseReference.setValue(Unknown Source)
                                                                        at curieo.android.zenmaster.mainfragments.HomeFragment$11.onDataChange(HomeFragment.java:750)
                                                                        at com.google.firebase.database.Query$1.onDataChange(Unknown Source)
                                                                        at com.google.android.gms.internal.zzbmz.zza(Unknown Source)
                                                                        at com.google.android.gms.internal.zzbnz.zzYj(Unknown Source)
                                                                        at com.google.android.gms.internal.zzboc$1.run(Unknown Source)
                                                                        at android.os.Handler.handleCallback(Handler.java:815)
                                                                        at android.os.Handler.dispatchMessage(Handler.java:104)
                                                                        at android.os.Looper.loop(Looper.java:207)
                                                                        at android.app.ActivityThread.main(ActivityThread.java:5740)
                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:766)
Run Code Online (Sandbox Code Playgroud)

如何在问题节点下保存整个数据并将其复制到 uid 节点。任何帮助都会很棒

Sar*_*wal 2

虽然不是一个很好的方法,但这种方法可以完成工作。

public void copyFirebaseData() {
    DatabaseReference questionNodes = FirebaseDatabase.getInstance().getReference().child("questions");
    final DatabaseReference toUsersQuestions = FirebaseDatabase.getInstance().getReference().child("users").child(uid).child("questions");

    questionNodes.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            for (DataSnapshot questionCode : dataSnapshot.getChildren()) {
                String questionCodeKey = questionCode.getKey();
                String correctAnswerString = questionCode.child("correctAnswer").getValue(String.class);
                String imageUrlString = questionCode.child("imageUrl").getValue(String.class);
                toUsersQuestions.child(questionCodeKey).child("imageUrl").setValue(imageUrlString);
                toUsersQuestions.child(questionCodeKey).child("correctAnswer").setValue(correctAnswerString);

            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}
Run Code Online (Sandbox Code Playgroud)