更新联系人生日的正确方法

问题描述

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

我尝试过删除当前生日并插入新的生日:

        // 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,CommonDataKinds.Event.TYPE_BIRTHDAY)
                .build())

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

解决方法

这两种方法都应该起作用,但是我赞成第一种方法,因为如果原始联系人还没有生日,第二种方法将无效。

我认为newDelete动作找不到现有的生日,这会导致创建两个生日,而不是更新现有的生日。

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

我认为问题可能出在您的选择/参数未转义results[0].count值上,请尝试以下操作:

TYPE_BIRTHDAY