我正在开发一个处理android contacts API的应用程序。我实现了插入,更新和查询联系人的方法。到目前为止一切顺利(写作和阅读联系人)。
在我的项目中,我遇到了一种奇怪的行为。
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];
}
RawContacts.getContactLookupUri(this.getContentResolver(), myContantRawContactUri);
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);
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,这根本不起作用?
更新 我使用sqlite分析了数据库。插入联系人时,会创建raw_contacts和contacts中的行。已删除标志设置为0,因此未标记为删除。如果我然后在应用程序中的另一个位置读取联系人,则返回null。此时的数据库转储不再包含联系人的行。
更新2: 我在版本2.3.3,4.0和4.1中使用模拟器测试了我的应用程序。所描述的行为仅出现在4.1 Jelly Bean中。
答案 0 :(得分:0)
好的,我找到了解决方案。这实际上是我自己的错。在我将自定义帐户添加到AccountManager之前,我添加了一个联系人。这显然删除了联系人,因为它设置了相同的帐户类型。