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

时间:2012-09-14 12:33:05

标签: android contacts android-contentprovider contactscontract

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

在我的项目中,我遇到了一种奇怪的行为。

  1. 我使用批处理模式插入联系人。我收到RawContact的URI。我在后台线程中这样做。
  2.     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
    2. RawContacts.getContactLookupUri(this.getContentResolver(), myContantRawContactUri);
      
      1. 我可以在插入后直接使用rawContactUri查询联系人(在同一个线程中)。 lookup uri返回null。
      2.     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或raw contact uri插入的联系人。两者都不返回内容提供者的行。我在主线程和另一个后台线程中尝试了它。
        2. 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中。

1 个答案:

答案 0 :(得分:0)

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