Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在android中从具有相同字段(仅该特定字段的值)的Firebase实时数据库检索到文本视图中的值?_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Java 如何在android中从具有相同字段(仅该特定字段的值)的Firebase实时数据库检索到文本视图中的值?

Java 如何在android中从具有相同字段(仅该特定字段的值)的Firebase实时数据库检索到文本视图中的值?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我真正需要的是在TextView中显示“收入”字段中的每个值 二百五十 105 这可能吗?如果可能的话,请帮助我 这就是我将值插入数据库的方式 private void addReport() { Float total_Income = Float.valueOf(tv_total_income.getText().toString()); String current_date = tv_current_date.getText().toString();

我真正需要的是在
TextView
中显示“收入”字段中的每个值

二百五十 105

这可能吗?如果可能的话,请帮助我

这就是我将值插入数据库的方式

private void addReport() {

    Float total_Income = Float.valueOf(tv_total_income.getText().toString());
    String current_date = tv_current_date.getText().toString();
    
    SimpleDateFormat sdf = new SimpleDateFormat("MMMM");
    String currentDateandTime = sdf.format(new Date());
    


    FirebaseDatabase mDatabase = FirebaseDatabase.getInstance();
    DatabaseReference mDbRef = mDatabase.getReference("Reports"+"/"+currentDateandTime+"/"+current_date).child("Date");
    mDbRef.setValue(current_date);
    DatabaseReference mDbRef1 = mDatabase.getReference("Reports"+"/"+currentDateandTime+"/"+current_date).child("Income");
    mDbRef1.setValue(total_Income);

}

尝试访问
Reports
June
的孩子,并循环访问以获得
income
,如下所示:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();    
DatabaseReference reportsRef = rootRef.child("Reports").child("June");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot ds : dataSnapshot.getChildren()) {
            String key = ds.getKey();
            DatabaseReference keyRef = rootRef.child(key).child("income");
            ValueEventListener valueEventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot ds1 : dataSnapshot.getChildren()) {
                        String income = ds1.getValue(String.class);
                        Log.d("TAG", income);
                    }
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {}
            };
            keyRef.addListenerForSingleValueEvent(valueEventListener);
        }
    }
    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
reportsRef.addListenerForSingleValueEvent(eventListener);

虽然Sairaj Sawant的答案可能有效,但请记住,没有必要在循环的每次迭代中都附加侦听器。更方便的解决方案是只附加一次侦听器,如以下代码行所示:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference juneRef = rootRef.child("Reports").child("June");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String totalIncome = "";
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            totalIncome = totalIncome + ds.child("Income").getValue(String.class) + " ";
            
        }
        Log.d("TAG", totalIncome);
        textView.setText(totalIncome);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d("TAG", databaseError.getMessage()); //Don't ignore errors!
    }
};
juneRef.addListenerForSingleValueEvent(valueEventListener);
仅当
Income
属性为String类型时,此代码才有效,因为它是在
20-06-2020
子项中设置的。但是,如果将该值设置为第二个
21-06-2020
子项中设置的
整数,则上述代码将无效。请记住,这两种类型的值必须匹配。您可以将两者都设置为字符串,上面的代码也可以工作,或者将它们设置为数字,在这种情况下,您应该使用此行:

totalIncome = totalIncome + ds.child("Income").getValue(Long.class) + " ";

你能试着详细说明你想说什么吗?最好添加一个子事件侦听器并维护一个包含所有值的ArrayList。我试过了,但不起作用。。。直到@Alex Mamo建议对代码进行更改。现在一切都很完美。。谢谢你帮我…我还有一个疑问,我能找到这些值的总和吗?比如总收入?当然可以。退房