@Override
  public Track createTrack(Cursor cursor) {
    int idIndex = cursor.getColumnIndexOrThrow(TracksColumns._ID);
    int nameIndex = cursor.getColumnIndexOrThrow(TracksColumns.NAME);
    int descriptionIndex = cursor.getColumnIndexOrThrow(TracksColumns.DESCRIPTION);
    int categoryIndex = cursor.getColumnIndexOrThrow(TracksColumns.CATEGORY);
    int startIdIndex = cursor.getColumnIndexOrThrow(TracksColumns.STARTID);
    int stopIdIndex = cursor.getColumnIndexOrThrow(TracksColumns.STOPID);
    int startTimeIndex = cursor.getColumnIndexOrThrow(TracksColumns.STARTTIME);
    int stopTimeIndex = cursor.getColumnIndexOrThrow(TracksColumns.STOPTIME);
    int numPointsIndex = cursor.getColumnIndexOrThrow(TracksColumns.NUMPOINTS);
    int totalDistanceIndex = cursor.getColumnIndexOrThrow(TracksColumns.TOTALDISTANCE);
    int totalTimeIndex = cursor.getColumnIndexOrThrow(TracksColumns.TOTALTIME);
    int movingTimeIndex = cursor.getColumnIndexOrThrow(TracksColumns.MOVINGTIME);
    int minLatIndex = cursor.getColumnIndexOrThrow(TracksColumns.MINLAT);
    int maxLatIndex = cursor.getColumnIndexOrThrow(TracksColumns.MAXLAT);
    int minLonIndex = cursor.getColumnIndexOrThrow(TracksColumns.MINLON);
    int maxLonIndex = cursor.getColumnIndexOrThrow(TracksColumns.MAXLON);
    int maxSpeedIndex = cursor.getColumnIndexOrThrow(TracksColumns.MAXSPEED);
    int minElevationIndex = cursor.getColumnIndexOrThrow(TracksColumns.MINELEVATION);
    int maxElevationIndex = cursor.getColumnIndexOrThrow(TracksColumns.MAXELEVATION);
    int elevationGainIndex = cursor.getColumnIndexOrThrow(TracksColumns.ELEVATIONGAIN);
    int minGradeIndex = cursor.getColumnIndexOrThrow(TracksColumns.MINGRADE);
    int maxGradeIndex = cursor.getColumnIndexOrThrow(TracksColumns.MAXGRADE);
    int mapIdIndex = cursor.getColumnIndexOrThrow(TracksColumns.MAPID);
    int tableIdIndex = cursor.getColumnIndexOrThrow(TracksColumns.TABLEID);
    int iconIndex = cursor.getColumnIndexOrThrow(TracksColumns.ICON);

    Track track = new Track();
    TripStatistics tripStatistics = track.getTripStatistics();
    if (!cursor.isNull(idIndex)) {
      track.setId(cursor.getLong(idIndex));
    }
    if (!cursor.isNull(nameIndex)) {
      track.setName(cursor.getString(nameIndex));
    }
    if (!cursor.isNull(descriptionIndex)) {
      track.setDescription(cursor.getString(descriptionIndex));
    }
    if (!cursor.isNull(categoryIndex)) {
      track.setCategory(cursor.getString(categoryIndex));
    }
    if (!cursor.isNull(startIdIndex)) {
      track.setStartId(cursor.getLong(startIdIndex));
    }
    if (!cursor.isNull(stopIdIndex)) {
      track.setStopId(cursor.getLong(stopIdIndex));
    }
    if (!cursor.isNull(startTimeIndex)) {
      tripStatistics.setStartTime(cursor.getLong(startTimeIndex));
    }
    if (!cursor.isNull(stopTimeIndex)) {
      tripStatistics.setStopTime(cursor.getLong(stopTimeIndex));
    }
    if (!cursor.isNull(numPointsIndex)) {
      track.setNumberOfPoints(cursor.getInt(numPointsIndex));
    }
    if (!cursor.isNull(totalDistanceIndex)) {
      tripStatistics.setTotalDistance(cursor.getFloat(totalDistanceIndex));
    }
    if (!cursor.isNull(totalTimeIndex)) {
      tripStatistics.setTotalTime(cursor.getLong(totalTimeIndex));
    }
    if (!cursor.isNull(movingTimeIndex)) {
      tripStatistics.setMovingTime(cursor.getLong(movingTimeIndex));
    }
    if (!cursor.isNull(minLatIndex)
        && !cursor.isNull(maxLatIndex)
        && !cursor.isNull(minLonIndex)
        && !cursor.isNull(maxLonIndex)) {
      int bottom = cursor.getInt(minLatIndex);
      int top = cursor.getInt(maxLatIndex);
      int left = cursor.getInt(minLonIndex);
      int right = cursor.getInt(maxLonIndex);
      tripStatistics.setBounds(left, top, right, bottom);
    }
    if (!cursor.isNull(maxSpeedIndex)) {
      tripStatistics.setMaxSpeed(cursor.getFloat(maxSpeedIndex));
    }
    if (!cursor.isNull(minElevationIndex)) {
      tripStatistics.setMinElevation(cursor.getFloat(minElevationIndex));
    }
    if (!cursor.isNull(maxElevationIndex)) {
      tripStatistics.setMaxElevation(cursor.getFloat(maxElevationIndex));
    }
    if (!cursor.isNull(elevationGainIndex)) {
      tripStatistics.setTotalElevationGain(cursor.getFloat(elevationGainIndex));
    }
    if (!cursor.isNull(minGradeIndex)) {
      tripStatistics.setMinGrade(cursor.getFloat(minGradeIndex));
    }
    if (!cursor.isNull(maxGradeIndex)) {
      tripStatistics.setMaxGrade(cursor.getFloat(maxGradeIndex));
    }
    if (!cursor.isNull(mapIdIndex)) {
      track.setMapId(cursor.getString(mapIdIndex));
    }
    if (!cursor.isNull(tableIdIndex)) {
      track.setTableId(cursor.getString(tableIdIndex));
    }
    if (!cursor.isNull(iconIndex)) {
      track.setIcon(cursor.getString(iconIndex));
    }
    return track;
  }