2017-11-08 7 views
0

클래스의 모든 노드 값을 저장하려고하지만 클래스에 저장하지 않는 것 같습니다. readDataListener()에서 가능한 수정을 알아낼 수 없습니다. 보시다시피 클래스의 모든 노드 값을 저장하려고하지만 잘못된 점을 알지 못합니다.Firebase 데이터 검색 오류

SymptomActivity.java

import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.google.firebase.database.DataSnapshot; 
import com.google.firebase.database.DatabaseError; 
import com.google.firebase.database.DatabaseReference; 
import com.google.firebase.database.FirebaseDatabase; 
import com.google.firebase.database.ValueEventListener; 

public class SymptomActivity extends AppCompatActivity { 


private DatabaseReference mFirebaseDatabase; 
private FirebaseDatabase mFirebaseInstance; 
Button button; 
TextView textView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_symptom); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    button = (Button) findViewById(R.id.button8); 
    textView = (TextView) findViewById(R.id.textView2); 


    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 
    }); 
    FirebaseDatabase.getInstance().setPersistenceEnabled(true); 


    // Write a message to the database 
    mFirebaseInstance = FirebaseDatabase.getInstance(); 
    // store app title to 'app_title' node 
    mFirebaseInstance.getReference("app_title").setValue("microDoctor"); 
    mFirebaseDatabase = mFirebaseInstance.getReference("symptomList"); 
    //mFirebaseDatabase.child("Headache").child("Some Value").setValue("Head"); 
    //mFirebaseDatabase.setValue("Headache"); 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      readDataListener(); 
     } 
    }); 
} 

private void readDataListener() { 
    mFirebaseDatabase.child("Abdominal Cramps").child("Diarrhea").child("Vomiting").addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Symptom symptom = dataSnapshot.getValue(Symptom.class); 

      // Check for null 
      if (symptom == null) { 
       Log.e("Data", "Symptom data is null!"); 
       return; 
      } 

      Log.e("Symptom Data", "User data is changed!"+symptom.symptom1); 

      // Display newly updated name and email 
      textView.setText(symptom.disease); 
     } 
     @Override 
     public void onCancelled(DatabaseError error) { 
      // Failed to read value 
      Log.e("Error", "Failed to read user", error.toException()); 
     } 
    }); 
}} 

Symptom.java 공용 클래스 증상 {

public String symptom1; 
public String symptom2; 
public String symptom3; 
public String disease; 

// Default constructor required for calls to 
// DataSnapshot.getValue(User.class) 
public Symptom(){ 

} 
public Symptom(String symptom1, String symptom2, String symptom3, String disease){ 
    this.symptom1 = symptom1; 
    this.symptom2 = symptom2; 
    this.symptom3 = symptom3; 
    this.disease = disease; 
} 
} 

데이터에 액세스하려고

enter image description here

답변

1

모델 클래스 파일에없는 노드 아래에서 데이터를 가져 오려고하기 때문에 오류가 발생합니다. 따라서 Vomiting을 (를) 매핑 할 수 없습니다.

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); 
DatabaseReference yourRef = rootRef.child("app_title").child("microDoctor").child("symptomList").child("Abdominal Cramps").child("Diarrhea").child("Vomiting"); 
ValueEventListener eventListener = new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     String disease = ds.child("disease").getValue(String.class); 
     Log.d("TAG", disease); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) {} 
}; 
yourRef.addListenerForSingleValueEvent(eventListener); 

출력 될 것입니다 : 또한 공용을 추가 할 필요가

Food Poisoning 

app_title이 중포 기지 루트의 직접적인 자식이라고 가정하면, 당신은 단순히 같은 그 값을 얻을 수 String class을 사용할 수 있습니다 setter와 getter를 다음과 같이 필드 클래스의 모델 클래스에 추가하십시오 :

+0

일부 코드가 변경되었습니다. 또한 이제는 액세스 할 수 있지만 이제는 노드의 모든 값을 클래스에 저장하는 작업을 수행합니다. –

0
public class Symptom { 
public String disease; 

// Default constructor required for calls to 
// DataSnapshot.getValue(User.class) 
public Symptom(){ 

} 
public Symptom(String disease){ 
this.disease = disease; 
} 

public String getDisease(){ 
return disease; 
} 
    public void setDisease(String disease){ 
    this.disease=disease; 
} 
     } 
+1

'Vomiting'은 모델 클래스의 필드가 실제로 노드이기 때문에 정확하지 않습니다. '질병'아동의 부모입니다. OP가 제공 한 실제 스크린 샷을 참조하십시오. –

+0

고마워요 @AlexMamo –

+0

코드의 일부분과 현재 진행중인 작업이 변경되었습니다. –

관련 문제