Java Firebase在第一时间不工作?

Java Firebase在第一时间不工作?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我想生成一份pdf报告,统计总订单和状态为“需要”的订单 我有这个代码来创建pdf和填写表格 private TemplatePDF templatePDF; FirebaseDatabase database; DatabaseReference reference; Button btnRatio1; ArrayList<String[]> rowqa=new ArrayList<>(); @Override protected void onCreate(B

我想生成一份pdf报告,统计总订单和状态为“需要”的订单

我有这个代码来创建pdf和填写表格

private TemplatePDF templatePDF;

FirebaseDatabase database;
DatabaseReference reference;

Button btnRatio1;

ArrayList<String[]> rowqa=new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_reportes);

    database=FirebaseDatabase.getInstance();
    reference=database.getReference("Requests");

    btnRatio1=findViewById(R.id.Quality);

    btnRatio1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            reference.orderByChild("date").startAt("1530002755582").endAt("1530504865654").
                    addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                            showData(dataSnapshot);
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {

                        }
                    });

            createTemplate(rowqa);
        }
    });
}

private void showData(DataSnapshot dataSnapshot){

    int total=(int)dataSnapshot.getChildrenCount();
    int count=0;
    String[]row;
    for (DataSnapshot myDataSnapshot : dataSnapshot.getChildren())
    {
        Request rq = myDataSnapshot.getValue(Request.class);
        if (rq.getStatuscali().equals("0"))
        {
            count++;
        }
    }
    row= new String[]{Common.getDate(Long.parseLong("1529945980802")),String.valueOf(count),String.valueOf(total),""+ count/total};
    addRow(row);

}
private void createTemplate(ArrayList<String[]> rowqa) {
    TemplatePDF templatePDF1 = new TemplatePDF(getApplicationContext());
    templatePDF1.openDocument("Quality");
    templatePDF1.addTitles("Frutifelles E.I.R.L.","Calidad de pedidos generados","25/06/2018");
    templatePDF1.createTable(header,rowqa);
    templatePDF1.closeDocument();
    templatePDF1.viewPDF();
}

private void addRow(String[]row){
    rowqa.add(row);
}
private TemplatePDF TemplatePDF;
Firebase数据库;
数据库参考;
按钮btnRatio1;
ArrayList rowqa=新的ArrayList();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_报告);
database=FirebaseDatabase.getInstance();
reference=database.getReference(“请求”);
btnRatio1=findViewById(R.id.Quality);
btnRatio1.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
参考.orderByChild(“日期”).startAt(“1530002755582”).endAt(“1530504865654”)。
addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
showData(dataSnapshot);
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
创建模板(rowqa);
}
});
}
私有void showData(DataSnapshot DataSnapshot){
int total=(int)dataSnapshot.getChildrenCount();
整数计数=0;
字符串[]行;
对于(DataSnapshot myDataSnapshot:DataSnapshot.getChildren())
{
Request rq=myDataSnapshot.getValue(Request.class);
if(rq.getStatuscali()等于(“0”))
{
计数++;
}
}
row=newstring[]{Common.getDate(Long.parseLong(“1529945980802”)),String.valueOf(count),String.valueOf(total),“”+count/total};
addRow(row);
}
私有void createTemplate(ArrayList rowqa){
TemplatePDF templatePDF1=新的TemplatePDF(getApplicationContext());
templatePDF1.openDocument(“质量”);
templatePDF1.addTitles(“Frutifelles E.I.R.L.,“Calidad de pedidos generados”,“2018年6月25日”);
templatePDF1.createTable(标题,行QA);
templatePDF1.closeDocument();
templatePDF1.viewPDF();
}
私有void addRow(字符串[]行){
rowqa.add(行);
}
第一次用这种方式显示我的pdf

但是第二次给我正确的答案


这似乎是第一次它不起作用

正如@Jen Person所说,你应该把
createTemplate(rowqa)
放在
onDataChange
回调中,否则当你第一次点击按钮时,
rowqa
是空的,因此
createTemplate(rowqa)
将得到一个空的PDF

例如:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_reportes);

    btnRatio1=findViewById(R.id.Quality);
    btnRatio1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          // dateStart, dateEnd should be instance fields
          queryData(dateStart, dateEnd);
        }
    });
}

private void queryData(String dateStart, String dateEnd) {
    database=FirebaseDatabase.getInstance();
    reference=database.getReference("Requests");
    reference.orderByChild("date")
            .startAt(dateStart)
            .endAt(dateEnd)
            .addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    showData(dataSnapshot);
                    createTemplate(rowqa);
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                }
            });
}

请将图片包括在帖子中,而不是发布link@IboOP没有足够的声誉来发布图片。是的,我没有。但是我试着去想worked@FrankvanPuffelen我忘了,我以为新成员可以马上发布图片。这似乎是异步编程的问题。您正在onDataChange函数外部调用
createTemplate(rowqa)
,因此它将在数据出现之前被触发。可能会有点帮助。是的,它是有效的,但现在我必须根据我选择的天数重复查询。因此,首先我必须加载矩阵,在createTemplate(rowqa)的末尾,我使用了两个按钮,第一个按钮在等待异步时加载数组,另一个按钮在等待createTemplate,有趣的是,ValueEventListeners并没有真正按照编码顺序捕获数据,因此我收到了一个混乱的报告。