queryPedometerData method

Future<int> queryPedometerData(
  1. int startTime,
  2. int endTime
)

Implementation

Future<int> queryPedometerData(int startTime, int endTime) async {
  //db 범위밖 1개씩 가져와서 데이터를 조합해야함
  List<Map<String, Object?>>? firstYesterdayMaps;
  List<Map<String, Object?>>? firstMaps = await db?.rawQuery('SELECT * from $tableName where timestamp >= $startTime limit 1');
  List<Map<String, Object?>>? lastMaps = await db?.rawQuery('SELECT * from $tableName where timestamp < $endTime ORDER BY id desc limit 1');

  Step? firstYesterdayStep;
  Step? firstStep;
  Step? lastStep;
  bool firstNoExist = false; //조회일 이전의 값이 db상 없을때, 앱 설치 이전에 값을 조회하는 것이므로 첫번째 값을 가져오는데 활용
  bool lastNoExist = false; //조회일 마지막 값이 db상 없을때, 현재시간 이후의 값을 가져오는 것과 같으므로 마지막 값을 가져오는데 활용

  if(firstMaps != null && firstMaps.isEmpty) {
    //db상 첫번째 데이터를 가져온다
    firstNoExist = true;
    firstMaps = await db?.rawQuery('SELECT * from $tableName limit 1');
  } else if(firstMaps != null && firstMaps.isNotEmpty) {
    //만약 오늘 기록된 값이 조금 늦어서 다른앱과 오차가 있다면 (15정도의 수준), 어제 마지막 기록값을 오늘 최초 걸음수로 가정하고 계산하여 오차를 줄여본다
    firstYesterdayMaps = await db?.rawQuery('SELECT * from $tableName where timestamp < $startTime ORDER BY id desc limit 1');
    if(firstYesterdayMaps != null && firstYesterdayMaps.isNotEmpty) {
      firstYesterdayStep = Step.fromMap(firstYesterdayMaps.first);
    }
  }

  if(firstMaps != null && firstMaps.isNotEmpty) {
    firstStep = Step.fromMap(firstMaps.first);
    if(firstYesterdayStep != null)  {
      int diff = (firstStep.timestamp ?? 0) - (firstYesterdayStep.timestamp ?? 0);
      if(diff > 0 && diff < 3600000) {  //1시간 이내의 오차라면
        firstStep = firstYesterdayStep; //어제 마지막 기록값을 오늘 최초 걸음수로 가정
      }
    }
  }

  if(lastMaps != null && lastMaps.isEmpty) {
    //db상 마지막 데이터를 가져온다
    lastNoExist = true;
    lastMaps = await db?.rawQuery('SELECT * from $tableName ORDER BY id desc limit 1');
  }
  if(lastMaps != null && lastMaps.isNotEmpty) {
    lastStep = Step.fromMap(lastMaps.first);
  }

  debugPrint("** lastTotal: ${lastStep?.total}, firstTotal: ${firstStep?.total}");
  //값 없을때 예상값 조회 시간 보정
  if(firstNoExist) { startTime = firstStep?.timestamp ?? startTime; }
  if(lastNoExist) { endTime = lastStep?.timestamp ?? endTime; }

  int realDataStep = (lastStep?.total ?? 0) - (firstStep?.total ?? 0);
  // int realDataDuration = (lastStep?.timestamp ?? 0) - (firstStep?.timestamp ?? 0);
  // if(realDataDuration == 0) realDataDuration = 1; //0으로 나누지 않게 예외처리

  // double percent = (endTime - startTime) / realDataDuration; //예상 데이터를 구하기 위한 환산된 비율
  //기록 걸음수

  debugPrint("** startTime: $startTime, endTime: $endTime, diff: ${endTime - startTime}, realDataStep: ${realDataStep}, plus: ${lastStep?.plus}, last: ${lastStep?.last}");

  // return (realDataStep * percent).toInt(); //예상값 리턴
  return realDataStep; //실제값 리턴
}