2017-02-24 18 views
2

ちょっと、複数のサブノードを持つ子ノード内のデータを別の場所にコピーしたいと思います。私はユーザーのUIDノードに質問ノード内のデータを転送したい上記画像における複数の子ノードを持つFirebaseノードを別のノードにコピーする

database

質問ノードの値には、正解と画像の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) { 
      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) { 

     } 
    }); 
}` 

試してみました。しかし、これは私が質問ノードの下に全データを保存し、uidのノードにコピーすることができますどのように例外

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) 

を投げています。 どのような助けも素晴らしいでしょう。

+0

最初にオブジェクトに値を追加しようとしましたが、そのオブジェクトを使用して値を設定しましたか? (ちょうど興味がある) – koceeng

+0

いいえ私はhaventない。私はこの例を使っています。これは適切なアプローチであることを示すhttp://stackoverflow.com/questions/40456443/how-to-move-firebase-child-from-one-node-to-another-in-androidそれ。 @koceeng –

+0

と 'HomeFragment'行750は' toUsersQuestions.setValue(... '、右? – koceeng

答えて

0

非常に良いアプローチではありませんが、このアプローチでは作業が完了します。

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

     } 
    }); 
} 
関連する問題