get all table values from firebase null object reference firebase database [duplicate]

老子叫甜甜 提交于 2019-12-04 05:03:00

问题


public class ShowBPGraphActivity extends AppCompatActivity {
public GraphView graphView;
public LineGraphSeries <DataPoint>lineGraphSeries; 
public String systolicbp;
public String diastolicbp;
public String timebp;
public String datebp;

public DatabaseReference db;
public BPFragmentTable bpFragmentTable = new BPFragmentTable(  );

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate( savedInstanceState );
    setContentView( R.layout.activity_show_bp_graph );
    ButterKnife.bind( this );

     db = FirebaseDatabase.getInstance().getReference("bpfragmentTable");

    final GraphView graph = (GraphView) findViewById( R.id.graphView );

    final List<BPFragmentTable> bpFragmentTableList = new ArrayList<>();

    //Get datasnapshot at your "users" root node
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("bpfragmentTable");
    ref.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    List<BPFragmentTable> bpfragmentTableList = new ArrayList<>();

                    for(DataSnapshot dataSnapshot1 :dataSnapshot.getChildren()){

                        BPFragmentTable bpfragmentTable = dataSnapshot1.getValue(BPFragmentTable.class);

                        systolic = bpfragmentTable.getSystolicbp();
                        diastolic = bpfragmentTable.getDiastolicbp();
                        date = bpfragmentTable.getDatebp();
                        time = bpfragmentTable.getTimebp();
                        //bpfragmentTable.setSystolicbp(systolic);
                        //bpfragmentTable.setDiastolicbp(diastolic);
                        //bpfragmentTable.setDatebp(date);
                        //bpfragmentTable.setTimebp(time);
                        bpfragmentTableList.add(bpfragmentTable);
                        // Toast.makeText(MainActivity.this,""+name,Toast.LENGTH_LONG).show();
                    }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    //handle databaseError
                }
            });
// please help me why i get null value in systolic diastolic date and time

            System.out.println( "systolicbp" + systolicbp );
            System.out.println( "diastolicbp" + diastolicbp );
            System.out.println( "datebp" + datebp );
            System.out.println( "timebp" + timebp );

    try {
        @SuppressLint("SimpleDateFormat") SimpleDateFormat formatter = new SimpleDateFormat("hh:mm a\nMMM dd yyyy");
        dateValued = formatter.parse(datebp);
        dateInMills = dateValued.getTime();
    } catch (ParseException e) {
        e.printStackTrace();
    }

    final long xlong = dateInMills;
    final int ysystolicInt  = Integer.parseInt( systolicbp );
    final int ydiastolicInt = Integer.parseInt( diastolicbp );

this is the error in the picture

I want to get bpfragmentTable all values and store all values in the string variable and use that variable to draw a graph in the graph view. I want to get all values from the table-BPFragment table in the picture:

and this is the class of getter and setter of BPFragmentTable.class

public class BPFragmentTable {

public String bpid;
public String systolicbp;
public String diastolicbp;
public String datebp;
public String timebp;

public BPFragmentTable(){}
public BPFragmentTable(String bpid,String systolicbp,String diastolicbp,String datebp,String timebp) {

     this.bpid = bpid;
     this.systolicbp = systolicbp;
     this.diastolicbp = diastolicbp;
     this.datebp = datebp;
     this.timebp = timebp;

}

public String getBpid() {
    return bpid;
}

public void setBpid(String  bpid) {
    this.bpid = bpid;
}

public String getSystolicbp() {
    return systolicbp;
}

public void setSystolicbp(String systolicbp) {
    this.systolicbp = systolicbp;
}

public String getDiastolicbp() {
    return diastolicbp;
}

public void setDiastolicbp(String diastolicbp) {
    this.diastolicbp= diastolicbp;
}

public String getDatebp() {
    return datebp;
}

public void setDatebp(String datebp) {
    this.datebp= datebp;
}

public String getTimebp() {
    return timebp;
}

public void setTimebp(String timebp) {
    this.timebp= timebp;
} 
}

Why do I get null object reference?


回答1:


Data is loaded from Firebase asynchronously. By the time you call formatter.parse(datebp) the onDataChange method hasn't run yet, and datebp hasn't been set. You will need to move the parsing of the data into onDataChange:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("bpfragmentTable");
ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<BPFragmentTable> bpfragmentTableList = new ArrayList<>();

        for(DataSnapshot dataSnapshot1 :dataSnapshot.getChildren()){

            BPFragmentTable bpfragmentTable = dataSnapshot1.getValue(BPFragmentTable.class);

            systolic = bpfragmentTable.getSystolicbp();
            diastolic = bpfragmentTable.getDiastolicbp();
            date = bpfragmentTable.getDatebp();
            time = bpfragmentTable.getTimebp();
            bpfragmentTableList.add(bpfragmentTable);

            System.out.println( "systolicbp" + systolicbp );
            System.out.println( "diastolicbp" + diastolicbp );
            System.out.println( "datebp" + datebp );
            System.out.println( "timebp" + timebp );

            try {
                @SuppressLint("SimpleDateFormat") SimpleDateFormat formatter = new SimpleDateFormat("hh:mm a\nMMM dd yyyy");
                dateValued = formatter.parse(datebp);
                dateInMills = dateValued.getTime();
            } catch (ParseException e) {
                e.printStackTrace();
            }

        }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException(); // don't ignore errors
    }
});

This asynchronous nature is a common pitfall for developers new to Firebase. Since asynchronous APIs are extremely common in modern programming, I highly recommend you learn about them quickly. For some good introductory material, see:

  • getContactsFromFirebase() method return an empty list (which also shows how to use an interface to get the values out of onDataChange)
  • this blog post on asynchronous APIs
  • Setting Singleton property value in Firebase Listener (where I explained how in some cases you can get synchronous data loading, but usually can't)


来源:https://stackoverflow.com/questions/51582992/get-all-table-values-from-firebase-null-object-reference-firebase-database

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!