如何更新多个群组以在 android 上联系?

Posted

技术标签:

【中文标题】如何更新多个群组以在 android 上联系?【英文标题】:How to update multiple groups to contact on android? 【发布时间】:2021-11-15 12:07:01 【问题描述】:

我刚刚成功地将多个组插入到一个联系人,但未能更新一个联系人的多个组。我的代码只更新了 1 个组,而不是所有 groupsId 列表(见下文)

    private fun updateGroupOnContact(
        operations: ArrayList<ContentProviderOperation>,
        where: String,
        args: Array<String>,
        groupsId: Array<String>
    ) 
        val values = ContentValues()

        groupsId.forEach 
            val newVal = ContentValues()
            newVal.put(ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID, it)
            values.putAll(newVal)
        

        operations.add(
            ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
                .withSelection(where, args)
                .withValues(values)
                .build()
        )
    

我已经尝试过这段代码:

groupsId.forEach 

        operations.add(
            ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
                .withSelection(where, args)
            .withValue(
                ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID, it
            )
                .build()
        )
    

我成功创建新联系人与多个组的代码。

contentProvideOperation.add(
        ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
            .withValue(
                ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID,
                groupID
            )
            .withValue(
                ContactsContract.CommonDataKinds.GroupMembership.MIMETYPE,
                ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE
            )
            .build()
    )

感谢任何帮助。

【问题讨论】:

【参考方案1】:

实际上我插入的 id 联系人有误,我应该在这个函数中使用原始联系人 ID。

private fun getRawContactId(contactId: String): String? 
        val projection = arrayOf(RawContacts._ID)
        val selection = RawContacts.CONTACT_ID + "=?"
        val selectionArgs = arrayOf(contactId)
        val c: Cursor = contentResolver?.query(
            RawContacts.CONTENT_URI,
            projection,
            selection,
            selectionArgs,
            null
        )
            ?: return null
        var rawContactId = -1
        if (c.moveToFirst()) 
            rawContactId = c.getInt(c.getColumnIndex(RawContacts._ID))
        
        c.close()
        return rawContactId.toString()
    

然后插入它(用于添加联系人的组),而不是使用更新。 因为更新只是设置组只有1组。

private fun insertGroupOnContact(
            operations: ArrayList<ContentProviderOperation>,
            contactId: String,
            groupId: String
        ) 
            ContentProviderOperation.newInsert(Data.CONTENT_URI).apply 
                withValue(Data.RAW_CONTACT_ID, getRawContactId(contactId))
                withValue(GroupMembership.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE)
                withValue(GroupMembership.GROUP_ROW_ID, groupId)
                operations.add(build())
            
        

如果要清除上一个联系人的组并插入多个。它应该首先更新它(1组)以删除以前的组,然后插入其他组。

private fun updateGroupOnContact(
    operations: ArrayList<ContentProviderOperation>,
    where: String,
    args: Array<String>,
    groupId: String
) 
    operations.add(
        ContentProviderOperation.newUpdate(Data.CONTENT_URI)
            .withSelection(where, args)
            .withValue(GroupMembership.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE)
            .withValue(GroupMembership.GROUP_ROW_ID, groupId)
            .build()
    )

【讨论】:

以上是关于如何更新多个群组以在 android 上联系?的主要内容,如果未能解决你的问题,请参考以下文章

游戏AI之群组行为

Onitem 单击功能以在 android 中联系应用程序

如何为联系人提供 UI 以在 CRM Dynamics 中更新他们的详细信息?

使用 MailChimp API V3 更新成员的群组兴趣

如何在 NSFetchedResultsController 中使用多对多关系?

在 Android 中的联系人详细信息上显示应用程序图标