从firebase获取数据快照时出错 - > java.lang.NumberFormatException:无效的int:""

时间:2018-05-09 16:20:21

标签: android firebase firebase-realtime-database

按钮点击活动代码

   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中,First Child是用户ID,然后是Push Id。

enter image description here

我想获取Meter Reading的最后一个条目,需要获取Final_Reading值才能进一步计算,但我得到null代替正确的数据。我使用firebase用于相同的Meter,但使用addValueListener我使用类获取但是这里无法获取。

我在调试模式下看到它没有进入dbmeter.add

我已将所有使用的变量声明为onCreate()方法。

错误

 java.lang.NumberFormatException: Invalid int: ""

现在出现在我获取的第一行

int imr = Integer.parseInt(freading);

1 个答案:

答案 0 :(得分:1)

您现在无法使用尚未加载的内容。换句话说,您不能简单地将freading变量创建为全局变量,并使用从onDataChange()方法之外的数据库获取的结果,因为它始终为null,到期此方法的异步行为。这意味着当您尝试在该方法之外使用该结果时,数据尚未从数据库中完成加载,这就是无法访问的原因。快速解决这个问题的方法是仅在onDataChange()方法中使用该结果,或者如果你想在外面使用它,我建议你从这个 {{3}看到我的anwser的最后一部分} 我已经开始使用自定义回调来完成它的完成。您还可以查看此 post ,以便更好地理解。