Contacts群组添加成员,多选列表过滤已添加数据

Group添加联系人时,Contacts默认设计不会过滤已分组的联系人。之前看到小米,oppo都做过过滤,一直懒得改。

最近客户要求group添加成员时,不显示已分组的联系人,故记录一下实现过程。

public void pickMembers() {
        Intent intent = new Intent(MultiPickContactActivity.ACTION_MULTI_PICK);
        intent.putExtra(MultiPickContactActivity.IS_CONTACT,true);
        //add by antoon, for group pick contacts
        intent.putExtra(MultiPickContactActivity.IS_GROUP_MEMBER_PICK,true);//增加标记,表示Contacts多选界面进行的是group pick member
        //end add
        intent.setClass(mActivity, MultiPickContactActivity.class);
        ContactListFilter filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_ACCOUNT,
                PhoneAccountType.ACCOUNT_TYPE, SimContactsConstants.PHONE_NAME, null, null);
        intent.putExtra(AccountFilterActivity.KEY_EXTRA_CONTACT_LIST_FILTER, filter);
        mActivity.startActivityForResult(intent, CODE_PICK_MEMBER);
    }

MultiPickContactActivity处理

//add by antoon, for group pick contacts
    public static final String IS_GROUP_MEMBER_PICK ="is_group_pick_contact"; 

public void onCreate(Bundle savedInstanceState) {
......
    else if (ACTION_MULTI_PICK.equals(action)) {
            if (!isContact) {
                mMode = MODE_DEFAULT_PHONE;
            } else {
                mMode = MODE_DEFAULT_CONTACT;
                //add by antoon, for group pick contacts
                if(getIntent().getBooleanExtra(IS_GROUP_MEMBER_PICK, false))
                    setTitle(R.string.ungrouped_contacts);
                //end add
            }
        } 
......
}
public void startQuery() {
        Uri uri = getUriToQuery();
        ContactListFilter filter = (ContactListFilter) getIntent().getExtra(
                          AccountFilterActivity.KEY_EXTRA_CONTACT_LIST_FILTER);
        if (filter != null) {
            if (filter.filterType == ContactListFilter.FILTER_TYPE_ACCOUNT) {
                // We should exclude the invisiable contacts.
                uri = uri.buildUpon().appendQueryParameter(RawContacts.ACCOUNT_NAME,
                         filter.accountName).appendQueryParameter(RawContacts.ACCOUNT_TYPE,
                         filter.accountType)
                        .appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY,
                         ContactsContract.Directory.DEFAULT+"").build();
                        
                //add by antoon, for group pick contacts
                if(getIntent().getBooleanExtra(IS_GROUP_MEMBER_PICK, false)){
                    uri = uri.buildUpon().appendQueryParameter(IS_GROUP_MEMBER_PICK, "true").build();//传递查询条件参数给ContactsProvider2使用
                }
                //end add
                
            } else if (filter.filterType == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS) {
                // Do not query sim contacts in airplane mode.
                if (!isShowSIM()) {
                    uri = uri.buildUpon().appendQueryParameter(RawContacts.ACCOUNT_TYPE,
                              SimAccountType.ACCOUNT_TYPE)
                             .appendQueryParameter(DefaultContactListAdapter.WITHOUT_SIM_FLAG,
                              "true").build();
                }
            }
        }
        String[] projection = getProjectionForQuery();
        String selection = getSelectionForQuery();
        String[] selectionArgs = getSelectionArgsForQuery();
        mQueryHandler.startQuery(QUERY_TOKEN, null, uri, projection, selection,
                selectionArgs, getSortOrder(projection));
    }

最关键是在ContactsProvider2中增加数据库查询判断条件。

protected Cursor queryLocal(final Uri uri, final String[] projection, String selection,
            String[] selectionArgs, String sortOrder, final long directoryId,
            final CancellationSignal cancellationSignal) {

        final SQLiteDatabase db = mDbHelper.get().getReadableDatabase();

        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
        ......

        final int match = sUriMatcher.match(uri);
        switch (match) {
            case SYNCSTATE:
            case PROFILE_SYNCSTATE:
                return mDbHelper.get().getSyncState().query(db, projection, selection,
                        selectionArgs, sortOrder);

            case CONTACTS: {
                setTablesAndProjectionMapForContacts(qb, uri, projection);
                appendLocalDirectoryAndAccountSelectionIfNeeded(qb, directoryId, uri);//设置查询条件,where字句
                break;
            }
private void appendLocalDirectoryAndAccountSelectionIfNeeded(SQLiteQueryBuilder qb,
            long directoryId, Uri uri) {
        final StringBuilder sb = new StringBuilder();
        if (directoryId == Directory.DEFAULT) {
            sb.append("(" + Contacts._ID + " IN " + Tables.DEFAULT_DIRECTORY + ")");
        } else if (directoryId == Directory.LOCAL_INVISIBLE){
            sb.append("(" + Contacts._ID + " NOT IN " + Tables.DEFAULT_DIRECTORY + ")");
        } else {
            sb.append("(1)");
        }

        ......

        //add by nxd 2015-5-18, for local group pick contacts 
        String isGroupMemPick = getQueryParameter(uri, IS_GROUP_MEMBER_PICK );
        if("true".equals(isGroupMemPick)){
            sb.append(" AND (" + Contacts.NAME_RAW_CONTACT_ID + " NOT IN (" +
                            "SELECT " + Data.RAW_CONTACT_ID + " FROM "
                            + Tables.DATA +
                            " WHERE " + Data.MIMETYPE + "_id =("
                      + "SELECT _id FROM mimetypes "
                      + "WHERE mimetype='vnd.android.cursor.item/local-groups')))");// mimetype_id=local-groups对应id,说明已分组
        }
        //end add
        qb.appendWhere(sb.toString());
    }

 

转载于:https://www.cnblogs.com/antoon/p/4511739.html

### 回答1: 可以使用 $push 操作符来向嵌套文档中添加一条数据。例如,假设我们有一个名为 "users" 的集合,其中每个文档都包含一个名为 "name" 的字段和一个名为 "addresses" 的嵌套文档数组。要向 "addresses" 数组中添加一条新的地址,可以使用以下命令: db.users.update( { name: "John" }, { $push: { addresses: { street: "123 Main St", city: "Anytown", state: "CA", zip: "12345" } } } ) 这将向名为 "John" 的用户文档的 "addresses" 数组中添加一条新的地址。 ### 回答2: 要在 MongoDB 中的嵌套文档中添加一条数据,我们可以使用 `$push` 或 `$addToSet` 操作符。 假设我们的嵌套文档类似于以下结构: ```json { "_id": "123456789", "name": "John Doe", "contacts": [ { "name": "Jane Smith", "email": "jane@example.com" }, { "name": "Bob Johnson", "email": "bob@example.com" } ] } ``` 现在我们要向 "John Doe" 的联系人列表添加一条新的联系人。我们可以使用以下代码来实现: ```javascript db.collection.update( { _id: "123456789" }, { $push: { contacts: { name: "Alice Brown", email: "alice@example.com" } } } ) ``` 这将向 "contacts" 数组中添加一个新的对象,该对象具有指定的属性和值。 如果我们只想添加独特的联系人,可以使用 `$addToSet` 操作符,以避免重复添加: ```javascript db.collection.update( { _id: "123456789" }, { $addToSet: { contacts: { name: "Alice Brown", email: "alice@example.com" } } } ) ``` 这样,如果 "Alice Brown" 已经存在于 "contacts" 数组中,它将不会被重复添加。 以上就是向 MongoDB 中的嵌套文档中添加一条数据的方法。 ### 回答3: 在MongoDB中,可以使用dot notation(点符号)来添加嵌套文档中的数据。 假设我们有一个集合(collection)叫做“users”,其中包含了一些用户的信息。每个用户文档包含了姓名(name)、年龄(age)和地址(address)等字段。如果我们想要给某个用户添加一个电话号码(phone)字段,我们可以按照下面的步骤进行操作: 1. 首先,我们需要找到该用户的文档。我们可以使用find方法来查询符合条件的文档,例如可以使用姓名来进行查找: ``` db.users.find({name: "John"}) ``` 2. 查询结果将返回一个或多个符合条件的文档。我们需要选择我们要添加电话号码的那个文档,并将其保存为一个变量(例如,我们将其保存为user)。 3. 接下来,我们可以使用更新操作(update)来添加电话号码。我们可以使用$set操作符来设置新的字段值。在这种情况下,我们可以使用点符号来指定嵌套文档中的字段: ``` db.users.update({_id: user._id}, {$set: {"phone": "1234567890"}}) ``` 在这个例子中,我们使用了用户的唯一标识符(_id)来定位到要更新的文档,并使用$set操作符来添加电话号码字段,并设置其值为"1234567890"。 通过这样的操作,我们就成功地给嵌套文档中添加了一条数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值