微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何使用 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 调用中,这样就不会出现任何其他应用程序/线程尝试更新相同原始联系人的竞争条件。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。