首页 > 解决方案 > 更新联系人生日的正确方法

问题描述

我正在尝试更新联系人的生日字段。无论我如何尝试,我总是会遇到问题,比如复制字段。

我尝试删除当前生日并插入一个新生日:

        // Update value.
        val list = java.util.ArrayList<ContentProviderOperation>()

        // Delete current value.
        val updateSelection = """${ContactsContract.Data.RAW_CONTACT_ID} = ? AND
                    ${ContactsContract.Data.MIMETYPE} = ? AND
                    ${CommonDataKinds.Event.TYPE} =
                    ${CommonDataKinds.Event.TYPE_BIRTHDAY}"""
        val selectionArgs = arrayOf(
                rawId.toString(), CommonDataKinds.Event.CONTENT_ITEM_TYPE)
        list.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI)
                .withSelection(updateSelection, selectionArgs)
                .build())

        // Add updated value.
        list.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                .withValue(ContactsContract.Data.RAW_CONTACT_ID, rawId)
                .withValue(ContactsContract.Data.MIMETYPE,
                        CommonDataKinds.Event.CONTENT_ITEM_TYPE)
                .withValue(CommonDataKinds.Event.START_DATE, birthdate)
                .withValue(CommonDataKinds.Event.TYPE,
                        CommonDataKinds.Event.TYPE_BIRTHDAY)
                .build())

我也尝试过直接更新值:

        list.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
                .withSelection(updateSelection, selectionArgs)
                .withValue(ContactsContract.Data.RAW_CONTACT_ID, rawId)
                .withValue(ContactsContract.Data.MIMETYPE,
                        CommonDataKinds.Event.CONTENT_ITEM_TYPE)
                .withValue(CommonDataKinds.Event.START_DATE, birthdate)
                .withValue(CommonDataKinds.Event.TYPE,
                        CommonDataKinds.Event.TYPE_BIRTHDAY)
                .build())

更新生日的正确方法是什么?

标签: androidandroid-contentproviderandroid-contacts

解决方案


两种方法都应该有效,但是我会投票支持第一种方法,因为如果原始联系人尚未包含生日,则第二种方法将不起作用。

我假设 newDelete 操作没有找到现有的生日,这将导致创建两个生日而不是更新现有的生日。

applyBatch您可以通过检查调用 ( )的返回值来验证这确实是问题所在ContentProviderResult[],因此如果删除是第一个操作,您可以检查是否results[0].count等于 1(删除了一行)。

我相信问题可能在于您的选择/参数没有转义TYPE_BIRTHDAY值,试试这个:

val updateSelection = """${Data.RAW_CONTACT_ID} = ? AND
                        ${Data.MIMETYPE} = ? AND
                        ${Event.TYPE} = ?"""
val selectionArgs = arrayOf(
                    rawId.toString(), Event.CONTENT_ITEM_TYPE, Event.TYPE_BIRTHDAY)

推荐阅读