Ошибка при получении снимка данных из firebase -> java.lang.NumberFormatException: Invalid int: "" - PullRequest
0 голосов
/ 09 мая 2018

Событие нажатия кнопки Код :

   btnsubmit.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {


                    String meterip = textView.getText().toString().trim();

                    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                    String userid = user.getUid();
                    Log.d("User Id",userid);

                    dbmeter= FirebaseDatabase.getInstance().getReference("Meter").child(userid);
                  Query query=dbmeter.orderByChild("final_Reading").limitToLast(1);

                    query.addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {


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

                                Meter m = customerSnapshot.getValue(Meter.class);
                                fmonth=m.getFinal_Month();
                                fyear=m.getFinal_Year();
                                freading=m.getFinal_Reading();
                                Log.d("Final Reading",freading);


                            }

                            if (dataSnapshot.getValue()==null)
                            {
                                Toast.makeText(getApplicationContext(),"Database Data not Found",Toast.LENGTH_LONG).show();
                            }

                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });


                    Log.d("Final Reading",freading);
                    int imr = Integer.parseInt(freading); //Error indicating int null value
                    int fmr = Integer.parseInt(meterip);

                    int unit = fmr-imr;
                    unitconsume = String.valueOf(unit);

                    int energy = Integer.parseInt(Energy);
                    int rent = Integer.parseInt(Rent);
                    int price = unit*energy;
                    float gstf = (float) (price*12)/100;

                    float grossamount = (float) price+rent+gstf;
                    gross = String.valueOf(grossamount);

                    gst = String.valueOf(gstf);

                    Date date = new Date();

                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMMM");
                    lmonth=simpleDateFormat.format(date).toUpperCase();

                    simpleDateFormat = new SimpleDateFormat("yyyy");
                    lyear=simpleDateFormat.format(date).toUpperCase();


                    String id = dbmeter.push().getKey();

                   Meter c = new Meter(id, freading,fmonth,fyear,meterip,lmonth,lyear,unitconsume,Energy,gst,Rent,gross);
                    dbmeter.child(id).setValue(c);
                Intent intent = new Intent(MeterReading.this, Drawer_MainPage.class);
                    startActivity(intent);
                    finish();

                }

            });

База данных Json Структура в Firebase, как показано ниже. В Meter первый ребенок - это идентификатор пользователя, а затем Push Id.

enter image description here

Я хочу получить последнюю запись для чтения метра, и мне нужно получить значение Final_Reading, чтобы рассчитать дальше, но вместо этого я получаю null вместо правильных данных. Я использовал Firebase для того же метра, но с addValueListener, где я получил с помощью класса, но здесь не удалось получить.

Я видел в режиме отладки, где он не входит в dbmeter.add.

Я объявил все используемые переменные выше onCreate() Метод.

Ошибка

 java.lang.NumberFormatException: Invalid int: ""

идет прямо сейчас в этом первом ряду, который я принес

int imr = Integer.parseInt(freading);

1 Ответ

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

Вы не можете использовать что-то, что еще не было загружено. Другими словами, вы не можете просто создать переменную freading как глобальную переменную и использовать результат, который вы получаете из базы данных вне метода onDataChange(), потому что он всегда будет null из-за асинхронного поведения этого метода , Это означает, что к тому времени, когда вы пытаетесь использовать этот результат вне этого метода, данные еще не закончили загрузку из базы данных, и поэтому они недоступны. Быстрое решение этой проблемы - использовать результаты только внутри метода onDataChange(), или, если вы хотите использовать его снаружи, я рекомендую вам посмотреть последнюю часть моего ответа из этой записи , в котором я объяснил, как это можно сделать с помощью пользовательского обратного вызова. Вы также можете взглянуть на это видео для лучшего понимания.

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