@Override
  public int delete(Uri uri, String selection, String[] selectionArgs) {
    final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
    final int match = sUriMatcher.match(uri);
    int numDeleted;
    switch (match) {
      case FLAVOR:
        numDeleted = db.delete(MoviesContract.MoviesEntry.TABLE_MOVIES, selection, selectionArgs);
        // reset _ID
        db.execSQL(
            "DELETE FROM SQLITE_SEQUENCE WHERE NAME = '"
                + MoviesContract.MoviesEntry.TABLE_MOVIES
                + "'");
        break;
      case FLAVOR_WITH_ID:
        numDeleted =
            db.delete(
                MoviesContract.MoviesEntry.TABLE_MOVIES,
                MoviesContract.MoviesEntry._ID + " = ?",
                new String[] {String.valueOf(ContentUris.parseId(uri))});
        // reset _ID
        db.execSQL(
            "DELETE FROM SQLITE_SEQUENCE WHERE NAME = '"
                + MoviesContract.MoviesEntry.TABLE_MOVIES
                + "'");

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

    return numDeleted;
  }
  @Override
  public Uri insert(Uri uri, ContentValues values) {
    final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
    Uri returnUri;
    switch (sUriMatcher.match(uri)) {
      case FLAVOR:
        {
          long _id = db.insert(MoviesContract.MoviesEntry.TABLE_MOVIES, null, values);
          // insert unless it is already contained in the database
          if (_id > 0) {
            returnUri = MoviesContract.MoviesEntry.buildFlavorsUri(_id);
          } else {
            throw new android.database.SQLException("Failed to insert row into: " + uri);
          }
          break;
        }

      default:
        {
          throw new UnsupportedOperationException("Unknown uri: " + uri);
        }
    }
    getContext().getContentResolver().notifyChange(uri, null);
    return returnUri;
  }
 @Override
 public Cursor query(
     Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
   Cursor retCursor;
   switch (sUriMatcher.match(uri)) {
       // All Flavors selected
     case FLAVOR:
       {
         retCursor =
             mOpenHelper
                 .getReadableDatabase()
                 .query(
                     MoviesContract.MoviesEntry.TABLE_MOVIES,
                     projection,
                     selection,
                     selectionArgs,
                     null,
                     null,
                     sortOrder);
         return retCursor;
       }
       // Individual flavor based on Id selected
     case FLAVOR_WITH_ID:
       {
         retCursor =
             mOpenHelper
                 .getReadableDatabase()
                 .query(
                     MoviesContract.MoviesEntry.TABLE_MOVIES,
                     projection,
                     MoviesContract.MoviesEntry._ID + " = ?",
                     new String[] {String.valueOf(ContentUris.parseId(uri))},
                     null,
                     null,
                     sortOrder);
         return retCursor;
       }
     default:
       {
         // By default, we assume a bad URI
         throw new UnsupportedOperationException("Unknown uri: " + uri);
       }
   }
 }
  @Nullable
  @Override
  public Cursor query(
      Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {

    Cursor retCursor;

    switch (sUriMatcher.match(uri)) {
      case MOVIE:
        retCursor =
            mOpenHelper
                .getReadableDatabase()
                .query(
                    MovieContract.FavoriteMovieEntry.TABLE_FAVORITE_MOVIES,
                    projection,
                    selection,
                    selectionArgs,
                    null,
                    null,
                    sortOrder);
        return retCursor;

      case MOVIE_WITH_ID:
        retCursor =
            mOpenHelper
                .getReadableDatabase()
                .query(
                    MovieContract.FavoriteMovieEntry.TABLE_FAVORITE_MOVIES,
                    projection,
                    MovieContract.FavoriteMovieEntry._ID + " = ?",
                    new String[] {String.valueOf(ContentUris.parseId(uri))},
                    null,
                    null,
                    sortOrder);
        return retCursor;

      default:
        throw new UnsupportedOperationException("Unknown uri: " + uri);
    }
  }
  @Override
  public int bulkInsert(Uri uri, ContentValues[] values) {
    final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
    final int match = sUriMatcher.match(uri);
    switch (match) {
      case FLAVOR:
        // allows for multiple transactions
        db.beginTransaction();

        // keep track of successful inserts
        int numInserted = 0;
        try {
          for (ContentValues value : values) {
            if (value == null) {
              throw new IllegalArgumentException("Cannot have null content values");
            }
            long _id = -1;
            try {
              _id = db.insertOrThrow(MoviesContract.MoviesEntry.TABLE_MOVIES, null, value);
            } catch (SQLiteConstraintException e) {
              Log.w(
                  LOG_TAG,
                  "Attempting to insert "
                      + value.getAsString(MoviesContract.MoviesEntry.COLUMN_TITLE)
                      + " but value is already in database.");
            }
            if (_id != -1) {
              numInserted++;
            }
          }
          if (numInserted > 0) {
            // If no errors, declare a successful transaction.
            // database will not populate if this is not called
            db.setTransactionSuccessful();
          }
        } finally {
          // all transactions occur at once
          db.endTransaction();
        }
        if (numInserted > 0) {
          // if there was successful insertion, notify the content resolver that there
          // was a change
          getContext().getContentResolver().notifyChange(uri, null);
        }
        return numInserted;
      default:
        return super.bulkInsert(uri, values);
    }
  }
  @Override
  public int update(
      Uri uri, ContentValues contentValues, String selection, String[] selectionArgs) {
    final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
    int numUpdated = 0;

    if (contentValues == null) {
      throw new IllegalArgumentException("Cannot have null content values");
    }

    switch (sUriMatcher.match(uri)) {
      case FLAVOR:
        {
          numUpdated =
              db.update(
                  MoviesContract.MoviesEntry.TABLE_MOVIES, contentValues, selection, selectionArgs);
          break;
        }
      case FLAVOR_WITH_ID:
        {
          numUpdated =
              db.update(
                  MoviesContract.MoviesEntry.TABLE_MOVIES,
                  contentValues,
                  MoviesContract.MoviesEntry._ID + " = ?",
                  new String[] {String.valueOf(ContentUris.parseId(uri))});
          break;
        }
      default:
        {
          throw new UnsupportedOperationException("Unknown uri: " + uri);
        }
    }

    if (numUpdated > 0) {
      getContext().getContentResolver().notifyChange(uri, null);
    }

    return numUpdated;
  }
  @Nullable
  @Override
  public Uri insert(Uri uri, ContentValues values) {

    final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
    Uri returnUri;

    switch (sUriMatcher.match(uri)) {
      case MOVIE:
        long _id = db.insert(MovieContract.FavoriteMovieEntry.TABLE_FAVORITE_MOVIES, null, values);
        if (_id > 0) {
          returnUri = MovieContract.FavoriteMovieEntry.buildMoviesUri(_id);
        } else {
          throw new android.database.SQLException("Failed to insert row into: " + uri);
        }
        break;
      default:
        throw new UnsupportedOperationException("Unknown uri: " + uri);
    }
    getContext().getContentResolver().notifyChange(uri, null);
    return returnUri;
  }