@Override
  public int delete(Uri uri, String selection, String[] selectionArgs) {
    SQLiteDatabase writableDatabase = mDbHelper.getWritableDatabase();

    int count;
    switch (sUriMatcher.match(uri)) {
      case MESSAGE_ALLROWS:
      case PROFILE_ALLROWS:
      case TASK_ALLROWS:
        count = writableDatabase.delete(getTableName(uri), selection, selectionArgs);
        break;

      case MESSAGE_SINGLE_ROW:
      case PROFILE_SINGLE_ROW:
      case TASK_SINGLE_ROW:
        count =
            writableDatabase.delete(
                getTableName(uri), "_id = ?", new String[] {uri.getLastPathSegment()});
        break;

      default:
        throw new IllegalArgumentException("Unsupported URI: " + uri);
    }

    getContext().getContentResolver().notifyChange(uri, null);
    return count;
  }
  @Override
  public Uri insert(Uri uri, ContentValues values) {
    final SQLiteDatabase db = mDbHelper.getWritableDatabase();
    final int match = sUriMatcher.match(uri);
    Uri returnUri;

    switch (match) {
      case PROFILE_ALLROWS:
        {
          long _id = db.insert(TasksContract.ProfileEntry.TABLE_NAME, null, values);
          if (_id > 0) returnUri = TasksContract.ProfileEntry.buildProfileUri(_id);
          else throw new android.database.SQLException("Failed to insert row into " + uri);
          break;
        }
      case TASK_ALLROWS:
        {
          long _id = db.insert(TasksContract.TaskEntry.TABLE_NAME, null, values);
          if (_id > 0) returnUri = TasksContract.TaskEntry.buildTaskUri(_id);
          else throw new android.database.SQLException("Failed to insert row into " + uri);
          break;
        }
      case MESSAGE_ALLROWS:
        {
          long _id = db.insert(TasksContract.MessageEntry.TABLE_NAME, null, values);
          if (_id > 0) returnUri = TasksContract.MessageEntry.buildMessageUri(_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) {
    SQLiteDatabase readableDatabase = mDbHelper.getReadableDatabase();
    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();

    switch (sUriMatcher.match(uri)) {
      case MESSAGE_ALLROWS:
      case PROFILE_ALLROWS:
      case TASK_ALLROWS:
        queryBuilder.setTables(getTableName(uri));
        break;

      case MESSAGE_SINGLE_ROW:
      case PROFILE_SINGLE_ROW:
      case TASK_SINGLE_ROW:
        queryBuilder.setTables(getTableName(uri));
        queryBuilder.appendWhere("_id = " + uri.getLastPathSegment());
        break;

      default:
        throw new IllegalArgumentException("Unsupported URI: " + uri);
    }

    Cursor returnCursor =
        queryBuilder.query(
            readableDatabase, projection, selection, selectionArgs, null, null, sortOrder);
    returnCursor.setNotificationUri(getContext().getContentResolver(), uri);
    return returnCursor;
  }