@Override
  public Cursor query(
      Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    final int match = URI_MATCHER.match(uri);
    mOpenHelper.prepareForConfiguration(getContext().getResources().getConfiguration());
    final SQLiteDatabase db = mOpenHelper.getReadableDatabase();
    SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
    String limit = uri.getQueryParameter(PartnerBookmarksContract.PARAM_LIMIT);
    String groupBy = uri.getQueryParameter(PartnerBookmarksContract.PARAM_GROUP_BY);
    switch (match) {
      case URI_MATCH_BOOKMARKS_FOLDER_ID:
      case URI_MATCH_BOOKMARKS_ID:
      case URI_MATCH_BOOKMARKS:
        {
          if (match == URI_MATCH_BOOKMARKS_ID) {
            // Tack on the ID of the specific bookmark requested
            selection =
                DatabaseUtils.concatenateWhere(
                    selection,
                    TABLE_BOOKMARKS + "." + PartnerBookmarksContract.Bookmarks.ID + "=?");
            selectionArgs =
                DatabaseUtils.appendSelectionArgs(
                    selectionArgs, new String[] {Long.toString(ContentUris.parseId(uri))});
          } else if (match == URI_MATCH_BOOKMARKS_FOLDER_ID) {
            // Tack on the ID of the specific folder requested
            selection =
                DatabaseUtils.concatenateWhere(
                    selection,
                    TABLE_BOOKMARKS + "." + PartnerBookmarksContract.Bookmarks.PARENT + "=?");
            selectionArgs =
                DatabaseUtils.appendSelectionArgs(
                    selectionArgs, new String[] {Long.toString(ContentUris.parseId(uri))});
          }
          // Set a default sort order if one isn't specified
          if (TextUtils.isEmpty(sortOrder)) {
            sortOrder = DEFAULT_BOOKMARKS_SORT_ORDER;
          }
          qb.setProjectionMap(BOOKMARKS_PROJECTION_MAP);
          qb.setTables(TABLE_BOOKMARKS);
          break;
        }

      case URI_MATCH_BOOKMARKS_FOLDER:
        {
          qb.setTables(TABLE_BOOKMARKS);
          String[] args;
          String query;
          // Set a default sort order if one isn't specified
          if (TextUtils.isEmpty(sortOrder)) {
            sortOrder = DEFAULT_BOOKMARKS_SORT_ORDER;
          }
          qb.setProjectionMap(BOOKMARKS_PROJECTION_MAP);
          String where = PartnerBookmarksContract.Bookmarks.PARENT + "=?";
          where = DatabaseUtils.concatenateWhere(where, selection);
          args = new String[] {Long.toString(FIXED_ID_PARTNER_BOOKMARKS_ROOT)};
          if (selectionArgs != null) {
            args = DatabaseUtils.appendSelectionArgs(args, selectionArgs);
          }
          query = qb.buildQuery(projection, where, null, null, sortOrder, null);
          Cursor cursor = db.rawQuery(query, args);
          return cursor;
        }

      case URI_MATCH_BOOKMARKS_PARTNER_BOOKMARKS_FOLDER_ID:
        {
          MatrixCursor c = new MatrixCursor(new String[] {PartnerBookmarksContract.Bookmarks.ID});
          c.newRow().add(FIXED_ID_PARTNER_BOOKMARKS_ROOT);
          return c;
        }

      default:
        {
          throw new UnsupportedOperationException("Unknown URL " + uri.toString());
        }
    }

    return qb.query(db, projection, selection, selectionArgs, groupBy, null, sortOrder, limit);
  }
 @Override
 public void onConfigurationChanged(Configuration newConfig) {
   mOpenHelper.prepareForConfiguration(getContext().getResources().getConfiguration());
 }