private ContentValues createContentValues(Track track) {
    ContentValues values = new ContentValues();
    TripStatistics tripStatistics = track.getTripStatistics();

    // Value < 0 indicates no id is available
    if (track.getId() >= 0) {
      values.put(TracksColumns._ID, track.getId());
    }
    values.put(TracksColumns.NAME, track.getName());
    values.put(TracksColumns.DESCRIPTION, track.getDescription());
    values.put(TracksColumns.CATEGORY, track.getCategory());
    values.put(TracksColumns.STARTID, track.getStartId());
    values.put(TracksColumns.STOPID, track.getStopId());
    values.put(TracksColumns.STARTTIME, tripStatistics.getStartTime());
    values.put(TracksColumns.STOPTIME, tripStatistics.getStopTime());
    values.put(TracksColumns.NUMPOINTS, track.getNumberOfPoints());
    values.put(TracksColumns.TOTALDISTANCE, tripStatistics.getTotalDistance());
    values.put(TracksColumns.TOTALTIME, tripStatistics.getTotalTime());
    values.put(TracksColumns.MOVINGTIME, tripStatistics.getMovingTime());
    values.put(TracksColumns.MINLAT, tripStatistics.getBottom());
    values.put(TracksColumns.MAXLAT, tripStatistics.getTop());
    values.put(TracksColumns.MINLON, tripStatistics.getLeft());
    values.put(TracksColumns.MAXLON, tripStatistics.getRight());
    values.put(TracksColumns.AVGSPEED, tripStatistics.getAverageSpeed());
    values.put(TracksColumns.AVGMOVINGSPEED, tripStatistics.getAverageMovingSpeed());
    values.put(TracksColumns.MAXSPEED, tripStatistics.getMaxSpeed());
    values.put(TracksColumns.MINELEVATION, tripStatistics.getMinElevation());
    values.put(TracksColumns.MAXELEVATION, tripStatistics.getMaxElevation());
    values.put(TracksColumns.ELEVATIONGAIN, tripStatistics.getTotalElevationGain());
    values.put(TracksColumns.MINGRADE, tripStatistics.getMinGrade());
    values.put(TracksColumns.MAXGRADE, tripStatistics.getMaxGrade());
    values.put(TracksColumns.MAPID, track.getMapId());
    values.put(TracksColumns.TABLEID, track.getTableId());
    values.put(TracksColumns.ICON, track.getIcon());
    return values;
  }
  @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;
  }