1

我正在测试两个项目上的Firebase。我希望更新recyclerview以添加项目,并使用firebase onChildAdded()侦听器提示recyclerview进行更新。这里是我写的火力地堡代码:Firebase字符串上的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); 
     } 
    }); 

下面是代码,在一个单独的片段,我用它来从火力地堡检索数据:

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

这里是错误。这很奇怪,因为错误是在“String newPollQuestion”中提示的。我使用完全相同的方法将“newPollImageURL”写入Firebase,并且该对象不为空。此外,还有2个设备,A和B.A创建项目并将其写入Firebase,然后将其正确读取。 B是被显示以下设备:

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

你是怎么做到的?这很奇怪,因为在第二个设备上,如果我正在更新Firebase的屏幕/活动上,则会出现错误。但是,如果我处于不同的屏幕/活动状态,然后导航到该屏幕/活动,则一切正常。 – tccpg288

回答

0

我不明白为什么,但改变:

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

到:

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

成功取出了空指针。任何想法为什么?

+2

如果在请求的路径中没有数据,则DataSnapshot上的getValue()可以返回null。你拿了那个null,然后试图对它调用toString()。不幸的是,javadoc并不清楚getValue()是否可以返回null。 –

+0

那么它是如何工作的,当我将其更改为String.class时,如果它为空? – tccpg288

+0

它工作?我怀疑getValue(String.class)也返回null,并将其放入您的Poll对象中,之后可能以TextView结束。把一个null放入TextView是可以的。 –