调用OnDataChange方法并报告null对象

时间:2018-05-24 08:56:21

标签: android firebase firebase-realtime-database nullpointerexception

我有一个应用程序,我使用firebase来存储我的数据。

我使用on OnDataChange方法在片段中检索我的数据,并在单独的活动中将数据添加到我的firebase。

片段作为一个单独的实体来检索数据是完美的。但是当我在我的活动中立即添加数据时,会自动调用此片段方法并报告my object-> datasnapshotobject.child("column_name") is null.

我已经写了一个条件,检查如果datasnapshotobject.exists()那么只做进一步的步骤。然而它绕过了上述所有行并直接跳转到datasnapshotobject.child("column_name")为空,给出了错误。我该如何解决这个问题?

检索数据的代码

 Firebase mref=new Firebase("https://robocon-89a7c.firebaseio.com/Competitions/");
mref.addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot dataSnapshot) {

    for(DataSnapshot dsp:dataSnapshot.getChildren() )
    {
            if(dsp.exists() && dsp.child("city").getValue(String.class).equalsIgnoreCase("Pune"))
            {
                String start_date=dsp.child("start_date").getValue(String.class);
                SimpleDateFormat curFormater = new SimpleDateFormat("dd-MM-yyyy");


                try {
                    Date chkDate = curFormater.parse(start_date);
                    Calendar cal = Calendar.getInstance();
                    String date1 = cal.get(Calendar.DATE)+"-"+(cal.get(Calendar.MONTH)+1) +"-"+cal.get(Calendar.YEAR);

                    Date currentDate = curFormater.parse(date1);

                    if(chkDate.compareTo(currentDate)>=0){
                        myList.add("\n"+dsp.child("competitionName").getValue(String.class)+"\n"+dsp.child("institutionName").getValue(String.class)+"\n"+dsp.child("start_date").getValue(String.class)+" at "+dsp.child("start_time").getValue(String.class));


                        //System.out.println("The entered date is within the range of six months");
                    }
                    else{
                        System.out.println("The entered date is before than the current system date");
                    }

                }
                catch (ParseException e) {

                    e.printStackTrace();
                }



            }


    }
    String values[]=new String[myList.size()];
    values=myList.toArray(values);


    ArrayAdapter<String> adapter=new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1,values);
    mylistView.setAdapter(adapter);
    mylistView.setVisibility(View.VISIBLE);
    // value=dataSnapshot.child("city").getValue(String.class);
    //   Toast.makeText(getApplicationContext(),"its "+value,Toast.LENGTH_SHORT).show();
    //chck.setText(ansList.get(0)+ansList.get(1)+ansList.get(2));
  }

  @Override
  public void onCancelled(FirebaseError firebaseError) {

  }
});

添加数据的代码:

Firebase firebase=new Firebase("https://robocon-89a7c.firebaseio.com/Competitions/");
   Firebase mainEle=firebase.child(unid);
   Firebase firebasechild=mainEle.child("competitionName");
   firebasechild.setValue(competition);
   Firebase firebasechild2=mainEle.child("institutionName");
   firebasechild2.setValue(institutionN);

这样我也添加了其他列和数据,只提供了一些。

2 个答案:

答案 0 :(得分:0)

我认为您的数据快照存在且确实不是空的,但节点结构与添加数据的方法不同,因此它没有您要查找的字段。

您在数据库上写道:

| - 变量“unid”内的东西

| ---- competitionName

| ------比赛

| ---- institutionName

| ------机构

试图检索:

| - city

| - start_date

| - competitionName

如果“city”或“start_date”是“unid”变量内的值,没问题。但至少对于competitionName,你需要输入一个节点。

答案 1 :(得分:0)

我使用过Firebase mref = new Firebase(“https://robocon-89a7c.firebaseio.com/Competitions/”); 因此,对于这个孩子,我得到的是主要的父母,到目前为止我所有的栏目都已提到。

我找到了解决方案。 如果您的数据库每次都有新值而不会更改现有值,请使用除 addValueEventListener 之外的 addListenerForSingleValueEvent ,因为这将有助于我们不监听更改并将连接只有在再次附上时才会回来。

现在这两个要求都是独立运作的,并且不会影响彼此的执行。