如何仅更新联系人而不是添加同步适配器

时间:2015-05-15 12:03:29

标签: android android-contacts contactscontract android-syncadapter rawcontactid

我的应用数据库中存储的数字很少。我想在联系人应用中匹配这些数字并更新与mimetype的联系。基本上是Whatsapp的作用。他们同步所有联系人,他们的应用程序图标就会联系。

我已完成同步部分,如果我添加新的联系人,那么我可以在联系人中显示我的应用程序图标。但我的要求是只更新现有联系人。

这是我试图更新联系人的内容,

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

        ops.add(ContentProviderOperation.newInsert(addCallerIsSyncAdapterParameter(Data.CONTENT_URI, true))
            .withValueBackReference(Data.RAW_CONTACT_ID,id)
            .withValue(Data.MIMETYPE, MIMETYPE)
            .withValue(Data.DATA1, "Username")
            .withValue(Data.DATA2, "Ite's Me")
            .build());

        try {
            context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
        }
        catch (Exception e) {
            e.printStackTrace();
        }

rawContactid我来自

Cursor cursor = context.getContentResolver().query(Data.CONTENT_URI, new String[] {Data.RAW_CONTACT_ID, Data.DISPLAY_NAME, Data.MIMETYPE, Data.CONTACT_ID }, 
             ContactsContract.CommonDataKinds.Phone.NUMBER + "= ?", 
                     new String[] {phonenumb}, null);

我无法在该联系人中添加连接。我究竟做错了什么。有人可以帮我这个。

提前致谢。

2 个答案:

答案 0 :(得分:0)

问题是您使用withValueBackReference来引用原始联系人ID。这将尝试使用您的参数作为批处理中先前操作的索引来获取原始联系人的id,即,如果id = 0,它将返回第一个操作,如果它是新生的插入联系,使用生成的id作为插入联系人数据的原始联系人ID。您想在此处使用withValue,因为您已拥有原始联系人ID。

答案 1 :(得分:0)

将您的人员数据插入新的raw_contact,然后使用agregationexception将其合并到cotacts列表中的现有raw_contact._id。

ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();
        ContentProviderOperation.Builder builder = ContentProviderOperation.newUpdate(ContactsContract.AggregationExceptions.CONTENT_URI);
        builder.withValue(ContactsContract.AggregationExceptions.TYPE, ContactsContract.AggregationExceptions.TYPE_KEEP_TOGETHER);
        builder.withValue(ContactsContract.AggregationExceptions.RAW_CONTACT_ID1, raw1);
        builder.withValue(ContactsContract.AggregationExceptions.RAW_CONTACT_ID2, raw2);
        ops.add(builder.build());