1

Firebaseを2つの項目でテストしています。私は、firebase onChildAdded()リスナーが更新するようにrecyclerviewを促すアイテムを追加するように、recyclerviewを更新したいと考えています。ここでFirebase String NullPointer項目

mSubmitPollCreation.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      //TODO: Need to determine if this is proper epoch - i.e. does it account for time zones 
      Calendar c = Calendar.getInstance(); 
      final String epochTime = String.valueOf(c.getTimeInMillis()); 

      //TODO: Need to check if poll requirements are added, i.e. Question, Answer, ...... 
      //check if image has been loaded first 
      if (resultImageURL != null){ 
       mBaseRef.child("Polls").child(epochTime).child("Image_URL").setValue(resultImageURL); 
      } else { 
       Toast.makeText(getApplicationContext(),getResources().getString(R.string.no_image_selected),Toast.LENGTH_LONG).show(); 
       return; 
      } 

      //Add Answer Counter defaulted to 0 
      Map<String, Object> pollAnswerCounter = new HashMap<String, Object>(); 
      pollAnswerCounter.put("Vote_Count", 0); 
      mBaseRef.child("Polls").child(epochTime).updateChildren(pollAnswerCounter); 

      //Add Question 
      Map<String, Object> pollQuestion = new HashMap<String, Object>(); 
      pollQuestion.put("Question", mCreatePollQuestion.getText().toString()); 
      mBaseRef.child("Polls").child(epochTime).updateChildren(pollQuestion); 

      if (mNumberOfPollAnswersCreatedByUser > 5){ 
       Toast.makeText(getApplicationContext(),getResources().getText(R.string.poll_answers_greater_than_five),Toast.LENGTH_LONG).show(); 
       mNumberOfPollAnswersCreatedByUser = 5; 
      } 
      //add answers to Firebase 
      for (int i = 0; i < mNumberOfPollAnswersCreatedByUser; i++){ 
       EditText editText = (EditText) mEditTextAnswerLayout.findViewWithTag(getResources().getString(R.string.created_answer_editText_id)+String.valueOf(i+1)); 
       String editTextInputForAnswer = String.valueOf(editText.getText()); 
       final String answerLabel = "Answer"; 
       Map<String, Object> answerChoice = new HashMap<String, Object>(); 
       answerChoice.put(answerLabel, editTextInputForAnswer); 
       mBaseRef.child("Polls").child(epochTime).child("Answers").child(String.valueOf(i+1)).updateChildren(pollAnswerCounter); 
       mBaseRef.child("Polls").child(epochTime).child("Answers").child(String.valueOf(i+1)).updateChildren(answerChoice); 
       Toast.makeText(getApplicationContext(),editTextInputForAnswer,Toast.LENGTH_SHORT).show(); 
      } 

      Intent toHomeActivity = new Intent(CreateActivity.this, HomeActivity.class); 
      toHomeActivity.putExtra("viewpager_position", 2); 
      startActivity(toHomeActivity); 
     } 
    }); 

コードは、私がFirebaseからデータを取得するために使用することを、別のフラグメントに、されています:ここで私はFirebaseへの書き込みコードがある

@Override 
public void onStart() { 
    super.onStart(); 
    mChildEventListener = new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      String newPollEpoch = dataSnapshot.getKey(); 
      Log.v("Child_Added", "The new child is " + newPollEpoch); 
      String newPollImageURL = dataSnapshot.child(IMAGE_URL).getValue().toString(); 
      String newPollQuestion = dataSnapshot.child(QUESTION_STRING).getValue().toString(); 
      mNewPollsAray.add(0, new Poll(newPollQuestion, newPollImageURL, newPollEpoch)); 
      mNewPollsAdapter.notifyDataSetChanged(); 
     } 


     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 

     } 

     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }; 
    mPollsRef.addChildEventListener(mChildEventListener); 

} 

@Override 
public void onStop() { 
    super.onStop(); 
    mPollsRef.removeEventListener(mChildEventListener); 
} 

をそしてここでエラーです。エラーが「文字列newPollQuestion」でプロンプト表示されるので、かなり奇妙です。私は "newPollImageURL"をFirebaseに書き込むために全く同じメソッドを使用していますが、そのオブジェクトはnullではありません。また、AとBの2つのデバイスがあります。Aはアイテムを作成してFirebaseに書き込み、それを正常に読み取ります。

12-03 16:21:20.255 21043-21043/com.troychuinard.fanpolls E/AndroidRuntime: FATAL EXCEPTION: main 
                     Process: com.troychuinard.fanpolls, PID: 21043 
                     java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference 
                      at com.troychuinard.fanpolls.Fragment.NewFragment$1.onChildAdded(NewFragment.java:159) 
                      at com.google.android.gms.internal.zzaip.zza(Unknown Source) 
                      at com.google.android.gms.internal.zzakp.zzcxi(Unknown Source) 
                      at com.google.android.gms.internal.zzaks$1.run(Unknown Source) 
                      at android.os.Handler.handleCallback(Handler.java:739) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:5417) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 


                     --------- beginning of system 
+0

データベースに入ったデータのJSONエクスポートを実行できますか? – vzsg

+0

どうやってそれをしますか? 2番目のデバイスでfirebaseが更新されている画面やアクティビティに積極的に参加している場合、エラーが発生するため、これは変です。しかし、私が別のスクリーン/アクティビティを使用していて、そのスクリーン/アクティビティに移動すると、すべてがうまくロードされます。 – tccpg288

答えて

0

私は理由を理解していないが、変更:

String newPollQuestion = dataSnapshot.child(QUESTION_STRING).getValue.toString; 

へ:

String newPollQuestion = dataSnapshot.child(QUESTION_STRING).getValue(String.class); 

が正常にNullPointerを取り除いBは、以下を表示しているデバイスです。どんな考え?

+2

要求されたパスにデータがない場合、DataSnapshotのgetValue()はnullを返します。そのnullをとり、その上でtoString()を呼び出そうとしました。 getValue()がnullを返すことができるというjavadocは残念なことです。 –

+0

それがnullだった場合、String.classに変更したとき、どうしましたか? – tccpg288

+0

動作しましたか?私はgetValue(String.class)もnullを返していたと思うし、それをあなたのPollオブジェクトに入れます。それはおそらくTextViewで終了しました。 TextViewにnullを入れることはOKです。 –

関連する問題