如何使用 ContentProviderOperation 更新多个电话号码

问题描述

首先,我的联系人插入代码:

    fun makeRawContact(): ContentProviderOperation.Builder {
        return ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
            .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE,getString(R.string.account_type_contacts))
            .withValue(ContactsContract.RawContacts.ACCOUNT_NAME,accountName)
    }

    fun makeData(mimeType: String): ContentProviderOperation.Builder {
        return ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID,0)
            .withValue(ContactsContract.Data.MIMETYPE,mimeType)
    }

    fun insert(): Int {
        val ops = ArrayList<ContentProviderOperation>()
        ops += makeRawContact().build()
        ops += makeData(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
            .withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,"testinsert")
            .build()

        ops += makeData(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
            .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER,"12345678")
            .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,1)
            .withValue(ContactsContract.CommonDataKinds.Phone.LABEL,null)
            .build()

        val result = contentResolver.applyBatch(ContactsContract.AUTHORITY,ops)
    }

通过调用 insert() 假设原始 id 为 8。

如果我想更新联系人姓名,我可以这样调用:

    fun updateData(rawId: Long,mimeType: String): ContentProviderOperation.Builder {
        return ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
            .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=?",arrayOf(rawId.toString()))
            .withValue(ContactsContract.Data.MIMETYPE,mimeType)
    }

    fun update() {
        val ops = ArrayList<ContentProviderOperation>()
        ops += updateData(8,ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
            .withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,"testupdate")
            .build()
        val result = contentResolver.applyBatch(ContactsContract.AUTHORITY,ops)
    }

我想更新原始 ID 为 8 的联系人的两个电话号码,但它只有一个电话号码 12345678。 我认为应该更新一个,另一个应该插入,所以我试图通过 ContentResolver 和原始 ID 获取电话号码的数据 ID。但这似乎很复杂,所以我提出了问题。有没有更好的办法?我已经看到如何删除所有号码并插入新的电话号码,但我相信还有更好的方法。

谢谢。

解决方法

如果您正在实施一个完整的联系人编辑器,允许用户查看和编辑信息项,那么您应该在每一行附加一个标志,说明该行是否未被修改/删除/插入/更新, 然后遍历行并相应地更新数据库。

如果您不这样做,我见过的最干净的方法是删除数据库中该原始联系人的任何现有电话,并插入新的/更新的电话。

尝试将删除操作和插入操作放入同一个 applyBatch 调用中,这样就不会出现任何其他应用程序/线程尝试更新相同原始联系人的竞争条件。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...