Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用ContentProviderOperation更新和插入联系人_Android - Fatal编程技术网

Android 使用ContentProviderOperation更新和插入联系人

Android 使用ContentProviderOperation更新和插入联系人,android,Android,我在Android 2.0+上面临更新/插入联系人的问题。 当电话簿为空但 当我第二次这样做的时候,一些文件,如电话、电子邮件被翻倍和绊倒等。 但N、FN、ORG都可以(一份) 在得到这个论坛的其他成员的建议后,我首先更新了一个联系人,然后ContentProviderResult[]返回了带有null的uri,然后我执行了一个插入操作,它就运行了 好的,但在那之后,我做了一个更新,所有联系人都聚合成一个-我得到了1个联系人,而不是电话簿中的3个联系人。这一个被破坏了,接触场是随机建立的 我设置

我在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());