@Override
  public int bulkInsert(Uri uri, ContentValues[] values) {
    SQLiteDatabase db = weatherDbHelper.getWritableDatabase();

    final int match = uriMatcher.match(uri);

    switch (match) {
      case WEATHER:
        db.beginTransaction();
        int returnCount = 0;
        try {
          for (ContentValues value : values) {
            long id = db.insert(WeatherContract.WeatherEntry.TABLE_NAME, null, value);
            if (-1 != id) {
              ++returnCount;
            }
          }
          db.setTransactionSuccessful();
        } finally {
          db.endTransaction();
        }

        getContext().getContentResolver().notifyChange(uri, null);

        return returnCount;

      default:
        return super.bulkInsert(uri, values);
    }
  }
  private Cursor getWeatherByLocationAndDay(Uri uri, String[] projection, String sortOrder) {
    String locationSetting = WeatherContract.WeatherEntry.getLocationSettingFromUri(uri);
    String day = WeatherContract.WeatherEntry.getDateFromUri(uri);

    return weatherByLocationSettingQueryBuilder.query(
        weatherDbHelper.getReadableDatabase(),
        projection,
        locationSettingWithDaySelection,
        new String[] {locationSetting, day},
        null,
        null,
        sortOrder);
  }
  @Override
  public int delete(Uri uri, String selection, String[] selectionArgs) {

    final String tableName = getTableName(uri);

    // do the actual deletion
    int affectedRows =
        weatherDbHelper.getWritableDatabase().delete(tableName, selection, selectionArgs);

    // notify any registered observers of this change
    if (selection == null || affectedRows > 0) {
      getContext().getContentResolver().notifyChange(uri, null);
    }

    return affectedRows;
  }
  @Override
  public Uri insert(Uri uri, ContentValues contentValues) {

    final int match = uriMatcher.match(uri);
    Uri returnUri = null;
    SQLiteDatabase db = weatherDbHelper.getWritableDatabase();

    switch (match) {
      case WEATHER:
        {
          long id = db.insert(WeatherContract.WeatherEntry.TABLE_NAME, null, contentValues);
          if (id > 0) {
            returnUri = WeatherContract.WeatherEntry.buildWeatherUri(id);
          } else {
            throw new SQLException("Failed to insert row into " + uri);
          }
          break;
        }

      case LOCATION:
        {
          long id = db.insert(WeatherContract.LocationEntry.TABLE_NAME, null, contentValues);
          if (id > 0) {
            returnUri = WeatherContract.LocationEntry.buildLocationUri(id);
          } else {
            throw new SQLException("Failed to insert row into " + uri);
          }
          break;
        }

      default:
        throw new UnsupportedOperationException("Unknown uri " + uri);
    }

    // notify any registered observers of this change
    getContext().getContentResolver().notifyChange(uri, null);

    return returnUri;
  }
  private Cursor getWeatherByLocationSetting(Uri uri, String[] projection, String sortOrder) {
    String locationSetting = WeatherContract.WeatherEntry.getLocationSettingFromUri(uri);
    String startDate = WeatherContract.WeatherEntry.getStartDateFromUri(uri);

    String[] selectionArgs;
    String selection;

    if (startDate == null) {
      selection = locationSettingSelection;
      selectionArgs = new String[] {locationSetting};
    } else {
      selection = locationSettingWithStartDateSelection;
      selectionArgs = new String[] {locationSetting, startDate};
    }

    return weatherByLocationSettingQueryBuilder.query(
        weatherDbHelper.getReadableDatabase(),
        projection,
        selection,
        selectionArgs,
        null,
        null,
        sortOrder);
  }
  @Override
  public Cursor query(
      Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    // Here's the switch statement that, given a URI, will determine what kind of request it is,
    // and query the database accordingly.
    Cursor retCursor;
    switch (uriMatcher.match(uri)) {
        // "weather/*/*"
      case WEATHER_WITH_LOCATION_AND_DATE:
        {
          retCursor = getWeatherByLocationAndDay(uri, projection, sortOrder);
          break;
        }
        // "weather/*"
      case WEATHER_WITH_LOCATION:
        {
          retCursor = getWeatherByLocationSetting(uri, projection, sortOrder);
          break;
        }
        // "weather"
      case WEATHER:
        {
          retCursor =
              weatherDbHelper
                  .getReadableDatabase()
                  .query(
                      WeatherContract.WeatherEntry.TABLE_NAME,
                      projection,
                      selection,
                      selectionArgs,
                      null,
                      null,
                      sortOrder);
          break;
        }
        // "location/*"
      case LOCATION_ID:
        {
          long locationId = ContentUris.parseId(uri);

          String modifiedSelection = WeatherContract.LocationEntry._ID + " = ?";

          retCursor =
              weatherDbHelper
                  .getReadableDatabase()
                  .query(
                      WeatherContract.LocationEntry.TABLE_NAME,
                      projection,
                      modifiedSelection,
                      new String[] {Long.toString(locationId)},
                      null,
                      null,
                      sortOrder);
          break;
        }
        // "location"
      case LOCATION:
        {
          retCursor =
              weatherDbHelper
                  .getReadableDatabase()
                  .query(
                      WeatherContract.LocationEntry.TABLE_NAME,
                      projection,
                      selection,
                      selectionArgs,
                      null,
                      null,
                      sortOrder);
          break;
        }

      default:
        throw new UnsupportedOperationException("Unknown uri: " + uri);
    }

    retCursor.setNotificationUri(getContext().getContentResolver(), uri);

    return retCursor;
  }