按钮点击活动代码:
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。
我想获取Meter Reading的最后一个条目,需要获取Final_Reading
值才能进一步计算,但我得到null
代替正确的数据。我使用firebase用于相同的Meter,但使用addValueListener
我使用类获取但是这里无法获取。
我在调试模式下看到它没有进入dbmeter.add
。
我已将所有使用的变量声明为onCreate(
)方法。
错误
java.lang.NumberFormatException: Invalid int: ""
现在出现在我获取的第一行
int imr = Integer.parseInt(freading);
答案 0 :(得分:1)
您现在无法使用尚未加载的内容。换句话说,您不能简单地将freading
变量创建为全局变量,并使用从onDataChange()
方法之外的数据库获取的结果,因为它始终为null
,到期此方法的异步行为。这意味着当您尝试在该方法之外使用该结果时,数据尚未从数据库中完成加载,这就是无法访问的原因。快速解决这个问题的方法是仅在onDataChange()
方法中使用该结果,或者如果你想在外面使用它,我建议你从这个 {{3}看到我的anwser的最后一部分} 我已经开始使用自定义回调来完成它的完成。您还可以查看此 post ,以便更好地理解。