Метод OnDataChange вызывается и сообщает о нулевом объекте - PullRequest
0 голосов
/ 24 мая 2018

У меня есть приложение, в котором я использую firebase для хранения своих данных.

Мои данные извлекаются во фрагменте с использованием метода OnDataChange, и я добавляю данные в свою базу данных в виде отдельного действия.

Фрагмент как отдельный объект для извлечения данных отлично работает.Но когда я сразу добавляю данные в свою деятельность, этот фрагментный метод вызывается автоматически и сообщает, что 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 голосов
/ 25 мая 2018

Я использовал Firebase mref = new Firebase ("https://robocon -89a7c.firebaseio.com / Competitions / ");Таким образом, от детей этого, я получаю uid, который является основным родителем, все мои упомянутые столбцы упомянуты до сих пор.

Я нашел решение.Если ваша база данных будет иметь новое значение каждый раз и не будет изменять существующие значения, пожалуйста, используйте addListenerForSingleValueEvent , отличный от addValueEventListener , потому что это поможет нам не прослушивать изменения и подключится только назадпри повторном присоединении.

Теперь оба требования работают независимо и не влияют на выполнение друг друга.

0 голосов
/ 25 мая 2018

Я думаю, что ваш datasnapshot существует и действительно не равен нулю, но структура узлов отличается от метода, в котором вы добавляете данные, поэтому в нем нет полей, которые вы ищете.

Вы написали в базе данных:

root

| - что-то внутри переменной "unid"

| ---- CompetName

| ------ соревнование

| ---- имя_учреждения

| ------ учреждение

И пытается получить:

root

| - city

| - start_date

| - CompetitionName

Если значением являются city или start_dateвнутри переменной "unid", нет проблем.Но, по крайней мере, для CompetitionName необходимо ввести один узел вниз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...