插入与android的联系并查询结果uri不会返回任何条目



我正在开发一个应用程序,该应用程序正在处理android联系人API。我实现了插入、更新和查询联系人的方法。到目前为止,一切都正常(写作和阅读联系人)。

在我的项目中,有一次我经历了一种奇怪的行为。

  1. 我使用批处理模式插入一个联系人。我收到RawContact的URI。我在后台线程中执行此操作
ArrayList<ContentProviderOperation> ops = new  ArrayList<ContentProviderOperation>();      
int rawContactInsertIndex = ops.size();  
// create rawContact  
ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
.withValue(RawContacts.ACCOUNT_TYPE, ConstantsContract.ACCOUNT_TYPE)
.withValue(RawContacts.ACCOUNT_NAME, accountName).build());
ops.add(createInsertOperation().withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
.withValue(StructuredName.DISPLAY_NAME, displayName).withValue(StructuredName.GIVEN_NAME, firstName)
.withValue(StructuredName.FAMILY_NAME, lastName).build());      
ContentProviderResult[] results = context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
if (results.length > 0) {
result = results[0];
}
  1. 然后我请求并存储查找uri
RawContacts.getContactLookupUri(this.getContentResolver(), myContantRawContactUri);
  1. 插入联系人后(在同一线程中),我可以直接使用rawContactUri查询联系人。查找uri返回null
Uri rawContactUri = appUser.getRawContactUri(ctx);
if (rawContactUri == null) {
return null;
}
String lastPathSegment = rawContactUri.getLastPathSegment();
long rawContactId = Long.decode(lastPathSegment);
if (rawContactUri != null) {
contact = readContactWithID(rawContactId, ContactsContract.Data.RAW_CONTACT_ID);
  1. 在项目的另一个地方,我想查询存储的查找uri或原始联系人uri插入的联系人I。两者都不返回来自内容提供程序的行。我在主线程和另一个后台线程中尝试了它
ctx.getContentResolver().query(ContactsContract.Data.CONTENT_URI, null,   ContactsContract.Data.RAW_CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " =   ?", new String[] { contactID + "",   ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE }, null);

我的第一个想法是,它可能与context.getContentResolver()有关。但android文档指出,ContentResolver对象范围是应用程序的包,所以整个应用程序都有ContentResolver。我说得对吗?

我做错了什么?为什么同一个rawContactUri在一个地方返回联系人,而在另一个地方不返回?为什么我从一个原始联系人那里得到一个查找uri,而这个uri根本不起作用?

更新:我使用sqlite分析了数据库。插入联系人时,将创建raw_contacts和contacts中的行。已删除标志设置为0,因此不标记为删除。如果我在应用程序的另一个位置读取联系人,它将返回null。此时的数据库转储不再包含联系人的行。

更新2:我用2.3.3、4.0和4.1版本的模拟器测试了我的应用程序。所描述的行为仅在4.1果冻豆中出现。

好的,我找到了解决方案。这实际上是我自己的错。在将我的自定义帐户添加到AccountManager之前,我添加了一个联系人。这显然删除了联系人,因为它设置了相同的帐户类型。

最新更新