我在Android 2.0+上遇到了更新/插入联系人的问题。 当电话簿为空时插入新联系人没有问题 当我第二次这样做时,一些像TEL,EMAIL这样的文件被加倍并绊倒等。 但N,FN,ORG都可以(一份)。
在得到其他成员这个论坛的建议后,我首先更新了一个联系人,然后ContentProviderResult []返回了uri的null然后我做了一个插入动作,它去了 好的,但之后我做了一个更新,所有的联系人都聚合成一个 - 我有一个联系人3,它存在于电话簿中。这个被破坏了,接触区是随机构建的。
我设置了Google帐户。
代码:
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT_URI)
.withValue(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DISABLED)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, accountType)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, accountName)
.build());
// add name
ContentProviderOperation.Builder builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0);
builder.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
builder.withValue(ContactsContract.CommonDataKinds.StructuredName.PHONETIC_FAMILY_NAME, name);
// phones
ContentProviderOperation.Builder builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0);
builder.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
builder.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phoneValue);
builder.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, phoneType);
builder.withValue(ContactsContract.CommonDataKinds.Phone.LABEL, phoneLabel);
ops.add(builder.build());
// emails ...
// orgs ...
try {
ContentProviderResult[] result = mContentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
}
} catch (Exception e) {
Log.e(LOG_TAG, "Exception while contact updating: " + e.getMessage());
}
此解决方案有什么问题?工作聚合引擎如何?
我很乐意帮忙。
虚假
答案 0 :(得分:1)
我遇到了同样的问题。我认为它应该以这种方式运作
opt.add(ContentProviderOperation.newUpdate(ContactsContract.Contacts.CONTENT_URI)
.withSelection(ContactsContract.Contacts._ID, new String[]{entity.getPeople()})
.withValue(ContactsContract.Contacts.DISPLAY_NAME, "daerba")
.build()
);
但它出了问题并报告了这一点。
android.database.sqlite.SQLiteException:绑定或列索引 范围
我认为必须有一个选择来更新联系人。所以withSelection对于告诉ContentResolver要更新哪个联系人非常重要。
希望这可以提供一些线索。
答案 1 :(得分:1)
答案 2 :(得分:0)
您正在重新定义构建器而不将其添加到ops中,因此永远不会为名称发送数据,这解释了为什么您的聚合非常奇怪。
// add name
ContentProviderOperation.Builder builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
// phones
ContentProviderOperation.Builder builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
由于可读性,我更喜欢在处理较小批次时使用以下格式....
ArrayList<ContentProviderOperation> batchOp = new ArrayList<ContentProviderOperation>();
batchOp.add(ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, accountName)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, accountType).build());