@Override
  public Cursor query(
      Uri url, String[] projectionIn, String selection, String[] selectionArgs, String sortOrder) {

    SQLiteQueryBuilder qBuilder = new SQLiteQueryBuilder();
    int match = URI_MATCHER.match(url);
    String groupBy = null;

    switch (match) {
      case GROUPS:
        qBuilder.setTables(TABLE_ROSTER + " " + QUERY_ALIAS);
        groupBy = RosterConstants.GROUP;
        break;

      case GROUP_MEMBERS:
        qBuilder.setTables(TABLE_ROSTER + " " + QUERY_ALIAS);
        qBuilder.appendWhere(RosterConstants.GROUP + "=");
        qBuilder.appendWhere(url.getPathSegments().get(1));
        break;

      case CONTACTS:
        qBuilder.setTables(TABLE_ROSTER + " " + QUERY_ALIAS);
        break;

      case CONTACT_ID:
        qBuilder.setTables(TABLE_ROSTER + " " + QUERY_ALIAS);
        qBuilder.appendWhere("_id=");
        qBuilder.appendWhere(url.getPathSegments().get(1));
        break;

      default:
        throw new IllegalArgumentException("Unknown URL " + url);
    }

    String orderBy;
    if (TextUtils.isEmpty(sortOrder) && match == CONTACTS) {
      orderBy = RosterConstants.DEFAULT_SORT_ORDER; // 默认按在线状态排序
    } else {
      orderBy = sortOrder;
    }

    SQLiteDatabase db = mOpenHelper.getReadableDatabase();
    Cursor ret = qBuilder.query(db, projectionIn, selection, selectionArgs, groupBy, null, orderBy);

    if (ret == null) {
      infoLog("RosterProvider.query: failed");
    } else {
      ret.setNotificationUri(getContext().getContentResolver(), url);
    }

    return ret;
  }