如何使用 ContentProviderOperation 更新多个 phone 号码

How to update multiple phone numbers using 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)
    }

假设raw id为8调用insert().

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

    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)
    }

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

谢谢。

如果您要实现一个允许用户查看和编辑 信息项的完整联系人编辑器,那么您应该在每一行附加一个标志,说明该行是否untouched/deleted/inserted/updated, 然后遍历行并相应地更新数据库。

如果您不这样做,我见过的最干净的方法是删除数据库中该原始联系人的所有现有电话,然后插入 new/updated 电话。

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