private void normalizeDate(ContentValues values) {
   // normalize the date value
   if (values.containsKey(WeatherEntry.COLUMN_DATE)) {
     long dateValue = values.getAsLong(WeatherEntry.COLUMN_DATE);
     values.put(WeatherEntry.COLUMN_DATE, WeatherContract.normalizeDate(dateValue));
   }
 }
  private void getWeatherDataFromJson(String forecastJsonStr, int numDays, String locationSetting)
      throws JSONException {

    // Location information
    final String OWM_CITY = "city";
    final String OWM_CITY_NAME = "name";
    final String OWM_COORD = "coord";
    final String OWM_COORD_LAT = "lat";
    final String OWM_COORD_LONG = "lon";

    // These are the names of the JSON objects that need to be extracted.

    final String OWM_LIST = "list";

    final String OWM_DATETIME = "dt";
    final String OWM_PRESSURE = "pressure";
    final String OWM_HUMIDITY = "humidity";

    final String OWM_WINDSPEED = "speed";

    final String OWM_WIND_DIRECTION = "deg";

    // All temperatures are children of the "temp" object.
    final String OWM_TEMPERATURE = "temp";
    final String OWM_MAX = "max";
    final String OWM_MIN = "min";

    final String OWM_WEATHER = "weather";
    final String OWM_DESCRIPTION = "main";
    final String OWM_WEATHER_ID = "id";

    JSONObject forecastJson = new JSONObject(forecastJsonStr);
    JSONArray weatherArray = forecastJson.getJSONArray(OWM_LIST);

    JSONObject cityJson = forecastJson.getJSONObject(OWM_CITY);
    String cityName = cityJson.getString(OWM_CITY_NAME);
    JSONObject coordJSON = cityJson.getJSONObject(OWM_COORD);
    double cityLatitude = coordJSON.getLong(OWM_COORD_LAT);
    double cityLongitude = coordJSON.getLong(OWM_COORD_LONG);

    // OWM returns daily forecasts based upon the local time of the city that is being
    // asked for, which means that we need to know the GMT offset to translate this data
    // properly.

    // Since this data is also sent in-order and the first day is always the
    // current day, we're going to take advantage of that to get a nice
    // normalized UTC date for all of our weather.

    long locationID =
        insertLocationInDatabase(locationSetting, cityName, cityLatitude, cityLongitude);

    Vector<ContentValues> cVVector = new Vector<ContentValues>(weatherArray.length());

    // Time dayTime = new Time();
    // dayTime.setToNow();

    // we start at the day returned by local time. Otherwise this is a mess.
    // int julianStartDay = Time.getJulianDay(System.currentTimeMillis(), dayTime.gmtoff);

    // now we work exclusively in UTC
    //  dayTime = new Time();

    String[] resultStrs = new String[numDays];
    for (int i = 0; i < weatherArray.length(); i++) {
      // For now, using the format "Day, description, hi/low"
      String day;
      String description;
      String highAndLow;
      double pressure;
      int humidity;
      double windSpeed;
      double windDirection;
      int weatherId;

      // Get the JSON object representing the day
      JSONObject dayForecast = weatherArray.getJSONObject(i);

      // The date/time is returned as a long.  We need to convert that
      // into something human-readable, since most people won't read "1400356800" as
      // "this saturday".
      long dateTime;
      // Cheating to convert this to UTC time, which is what we want anyhow
      dateTime = dayForecast.getLong(OWM_DATETIME);
      pressure = dayForecast.getDouble(OWM_PRESSURE);
      humidity = dayForecast.getInt(OWM_HUMIDITY);
      windSpeed = dayForecast.getDouble(OWM_WINDSPEED);
      windDirection = dayForecast.getDouble(OWM_WIND_DIRECTION);

      // day = getReadableDateString(dateTime);

      // description is in a child array called "weather", which is 1 element long.
      JSONObject weatherObject = dayForecast.getJSONArray(OWM_WEATHER).getJSONObject(0);
      description = weatherObject.getString(OWM_DESCRIPTION);
      weatherId = weatherObject.getInt(OWM_WEATHER_ID);

      // Temperatures are in a child object called "temp".  Try not to name variables
      // "temp" when working with temperature.  It confuses everybody.
      JSONObject temperatureObject = dayForecast.getJSONObject(OWM_TEMPERATURE);
      double high = temperatureObject.getDouble(OWM_MAX);
      double low = temperatureObject.getDouble(OWM_MIN);

      ContentValues weatherValues = new ContentValues();

      weatherValues.put(WeatherContract.WeatherEntry.COLUMN_LOC_KEY, locationID);
      weatherValues.put(
          WeatherContract.WeatherEntry.COLUMN_DATE,
          WeatherContract.getDbDateString(new Date(dateTime * 1000L)));
      weatherValues.put(WeatherContract.WeatherEntry.COLUMN_HUMIDITY, humidity);
      weatherValues.put(WeatherContract.WeatherEntry.COLUMN_PRESSURE, pressure);
      weatherValues.put(WeatherContract.WeatherEntry.COLUMN_WIND_SPEED, windSpeed);
      weatherValues.put(WeatherContract.WeatherEntry.COLUMN_DEGREE, windDirection);
      weatherValues.put(WeatherContract.WeatherEntry.COLUMN_MAX_TEMP, high);
      weatherValues.put(WeatherContract.WeatherEntry.COLUMN_MIN_TEMP, low);
      weatherValues.put(WeatherContract.WeatherEntry.COLUMN_SHORT_DESC, description);
      weatherValues.put(WeatherContract.WeatherEntry.COLUMN_WEATHER_ID, weatherId);

      cVVector.add(weatherValues);
    }

    if (cVVector.size() > 0) {
      ContentValues[] cvArray = new ContentValues[cVVector.size()];
      cVVector.toArray(cvArray);
      mContext.getContentResolver().bulkInsert(WeatherContract.WeatherEntry.CONTENT_URI, cvArray);
    }
  }