Android 使用ContentProviderOperation更新和插入联系人
我在Android 2.0+上面临更新/插入联系人的问题。 当电话簿为空但 当我第二次这样做的时候,一些文件,如电话、电子邮件被翻倍和绊倒等。 但N、FN、ORG都可以(一份) 在得到这个论坛的其他成员的建议后,我首先更新了一个联系人,然后ContentProviderResult[]返回了带有null的uri,然后我执行了一个插入操作,它就运行了 好的,但在那之后,我做了一个更新,所有联系人都聚合成一个-我得到了1个联系人,而不是电话簿中的3个联系人。这一个被破坏了,接触场是随机建立的 我设置了谷歌帐号 代码:Android 使用ContentProviderOperation更新和插入联系人,android,Android,我在Android 2.0+上面临更新/插入联系人的问题。 当电话簿为空但 当我第二次这样做的时候,一些文件,如电话、电子邮件被翻倍和绊倒等。 但N、FN、ORG都可以(一份) 在得到这个论坛的其他成员的建议后,我首先更新了一个联系人,然后ContentProviderResult[]返回了带有null的uri,然后我执行了一个插入操作,它就运行了 好的,但在那之后,我做了一个更新,所有联系人都聚合成一个-我得到了1个联系人,而不是电话簿中的3个联系人。这一个被破坏了,接触场是随机建立的 我设置
ArrayList ops=new ArrayList();
添加(ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT\uURI)
.withValue(已禁用RawContacts.AGGREGATION\u模式、RawContacts.AGGREGATION\u模式)
.withValue(contacts contract.raw contacts.ACCOUNT\u类型,accountType)
.withValue(contacts contract.raw contacts.ACCOUNT\u NAME,accountName)
.build());
//添加名称
ContentProviderOperation.Builder=ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT\u URI);
带ValueBackReference的生成器(contacts contract.Data.RAW\u CONTACT\u ID,0);
builder.withValue(contacts contract.Data.MIMETYPE,
ContactsContract.CommonDataTypes.StructuredName.CONTENT\u ITEM\u TYPE);
builder.withValue(contacts contract.commonDataTypes.StructuredName.拼音\u FAMILY\u NAME,NAME);
//电话
ContentProviderOperation.Builder=ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT\u URI);
带ValueBackReference的生成器(contacts contract.Data.RAW\u CONTACT\u ID,0);
builder.withValue(contacts contract.Data.MIMETYPE,
Contacts contract.CommonDataTypes.Phone.CONTENT\u ITEM\u TYPE);
builder.withValue(contacts contract.commonDataTypes.Phone.NUMBER,phoneValue);
builder.withValue(ContactsContract.CommonDataTypes.Phone.TYPE,phoneType);
builder.withValue(contacts contract.commonDataTypes.Phone.LABEL,phoneLabel);
ops.add(builder.build());
//电子邮件。。。
//奥格斯。。。
试一试{
ContentProviderResult[]result=mContentResolver.applyBatch(contacts contract.AUTHORITY,ops);
}
}捕获(例外e){
Log.e(Log_标记,“联系人更新时异常:”+e.getMessage());
}
这个解决方案有什么问题?聚合引擎如何工作
我很高兴能得到帮助
我遇到了同样的问题。我认为应该这样做
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:绑定或列索引超出
射程
我认为必须有一个选择来更新联系人。因此,选择告诉ContentResolver要更新哪个联系人是很重要的
希望这能提供一些线索。您正在重新定义构建器,而没有将其添加到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());
ArrayList batchOp=new ArrayList();
add(ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT\u URI)
.withValue(contacts contract.raw contacts.ACCOUNT\u NAME,accountName)
.withValue(ContactsContract.RawContacts.ACCOUNT_类型,accountType).build());
如果要进行更新,必须为每个ContentProviderOperation提供where子句,请参阅和。WithSelect要求字符串[]的参数用“?”表示,即,WithSelect(ContractsContract.Contacts.\u ID+“=?”,新字符串[]{“5”})
如果没有“?”则没有任何东西可以绑定字符串[]值到…@wiseideal感谢指向正确方向的指针。选举当然是我的问题。
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());