Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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_Android Studio_Firebase Realtime Database - Fatal编程技术网

Java Android Firebase数据库获取值

Java Android Firebase数据库获取值,java,android,firebase,android-studio,firebase-realtime-database,Java,Android,Firebase,Android Studio,Firebase Realtime Database,我想从firebase实时数据库获取数据 我需要获取所有日期中的isPresent和otDuration值。 我的数据库参考是 mDatabase = FirebaseDatabase.getInstance().getReference().child("employee").child(emp_ID).child("attendance"); 我需要访问otDuration,以便计算总otDuration。 日期值不应在代码中提供,我需要以某种方式

我想从firebase实时数据库获取数据

我需要获取所有日期中的isPresentotDuration值。 我的数据库参考是

mDatabase = FirebaseDatabase.getInstance().getReference().child("employee").child(emp_ID).child("attendance");
我需要访问
otDuration
,以便计算总
otDuration

日期值不应在代码中提供,我需要以某种方式获取所有的
otDuration
值。

如果您将侦听器附加到该引用,您将获得一个
DataSnapshot
,其中包含该位置下的所有数据。只要知道子节点/属性的名称,就可以使用
child(“名称”)
访问它。只要不知道子节点的名称,就可以在该级别上循环使用
DataSnapshot.getChildren()

比如:

mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot dateSnapshot: dataSnapshot.getChildren()) {
            Log.i("Firebase", dateSnapshot.getKey()); // "2020-7-5", "2020-7-6"
            Log.i("Firebase", dateSnapshot.child("otDuration").getValue(String.class)); // "0", "1.5"
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException();
    }
}
double sum = 0.0;
for (DataSnapshot dateSnapshot: dataSnapshot.getChildren()) {
    String value = dateSnapshot.child("otDuration").getValue(String.class));
    sum += Double.parseDouble(value);
}
Log.i("Sum", String.valueOf(sum));
然后对这些值求和,循环如下:

mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot dateSnapshot: dataSnapshot.getChildren()) {
            Log.i("Firebase", dateSnapshot.getKey()); // "2020-7-5", "2020-7-6"
            Log.i("Firebase", dateSnapshot.child("otDuration").getValue(String.class)); // "0", "1.5"
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException();
    }
}
double sum = 0.0;
for (DataSnapshot dateSnapshot: dataSnapshot.getChildren()) {
    String value = dateSnapshot.child("otDuration").getValue(String.class));
    sum += Double.parseDouble(value);
}
Log.i("Sum", String.valueOf(sum));
需要考虑的几件事:

  • 我强烈建议在日期中填充值,使其成为“2020-07-05”和“2020-07-06”。这将使未来可能的查询更有可能。如果您想这样做,我建议您查看Java的
    DateFormatter
  • 您正在将
    otDuration
    值存储为字符串,但希望对其进行计算。我建议将它们存储为数值,这样就不必来回地将字符串转换为数字

    • 对我来说,它通过使用软件包工作。 这是我的代码的一部分,适合您的用例,希望它能工作

      import 'package:cloud_firestore/cloud_firestore.dart';
      
      DocumentReference employeeAttendance = Firestore.instance.collection('employee')
                                                     .document(emp_ID)
                                                     .collection('attendance')
                                                     .document('2020-7-5');
      
      employeeAttendance.get().then((documentSnapshot) {
          String isPresent = documentSnapshot.data['isPresent'].toString();
      }
      

      谢谢你的回答。但我的应用程序使用Java。我希望你的回答对那些与弗利特合作的人有用。