@Override
  public int delete(Uri url, String where, String[] whereArgs) {
    SQLiteDatabase db = mOpenHelper.getWritableDatabase();
    int count;
    switch (URI_MATCHER.match(url)) {
      case CONTACTS:
        count = db.delete(TABLE_ROSTER, where, whereArgs);
        break;

      case CONTACT_ID:
        String segment = url.getPathSegments().get(1);

        if (TextUtils.isEmpty(where)) {
          where = "_id=" + segment;
        } else {
          where = "_id=" + segment + " AND (" + where + ")";
        }

        count = db.delete(TABLE_ROSTER, where, whereArgs);
        break;

      default:
        throw new IllegalArgumentException("Cannot delete from URL: " + url);
    }

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

    return count;
  }
  @Override
  public Uri insert(Uri url, ContentValues initialValues) {
    if (URI_MATCHER.match(url) != CONTACTS) {
      throw new IllegalArgumentException("Cannot insert into URL: " + url);
    }

    ContentValues values =
        (initialValues != null) ? new ContentValues(initialValues) : new ContentValues();

    for (String colName : RosterConstants.getRequiredColumns()) {
      if (values.containsKey(colName) == false) {
        throw new IllegalArgumentException("Missing column: " + colName);
      }
    }

    SQLiteDatabase db = mOpenHelper.getWritableDatabase();

    long rowId = db.insert(TABLE_ROSTER, RosterConstants.USER_ID, values);

    if (rowId < 0) {
      throw new SQLException("Failed to insert row into " + url);
    }

    Uri noteUri = ContentUris.withAppendedId(CONTENT_URI, rowId);

    notifyChange();

    return noteUri;
  }
  @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;
  }
  @Override
  public int update(Uri url, ContentValues values, String where, String[] whereArgs) {
    int count;
    long rowId = 0;
    int match = URI_MATCHER.match(url);
    SQLiteDatabase db = mOpenHelper.getWritableDatabase();

    switch (match) {
      case CONTACTS:
        count = db.update(TABLE_ROSTER, values, where, whereArgs);
        break;
      case CONTACT_ID:
        String segment = url.getPathSegments().get(1);
        rowId = Long.parseLong(segment);
        count = db.update(TABLE_ROSTER, values, "_id=" + rowId, whereArgs);
        break;
      default:
        throw new UnsupportedOperationException("Cannot update URL: " + url);
    }

    notifyChange();

    return count;
  }
 public static void clearDatabase() {
   mOpenHelper.clearDatabase();
 }