【问题标题】:Android not adding all contacts with duplicate fieldsAndroid没有添加所有具有重复字段的联系人
【发布时间】:2011-05-09 17:04:27
【问题描述】:

在 Android 2.1 更新 1 中添加重复的联系人字段时,我遇到了一个大问题

请看我的代码:

      ArrayList<ContentProviderOperation> op_list = new ArrayList<ContentProviderOperation>();

  op_list.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
         .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
         .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
         .build());

  // first and last names
       op_list.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
   .withValueBackReference(Data.RAW_CONTACT_ID, 0)
         .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
         .withValue(StructuredName.GIVEN_NAME, "MyFirstName")
         .withValue(StructuredName.FAMILY_NAME, "MyLastName")
         .build());

  try{
   ContentProviderResult[] results = cResolver.applyBatch(ContactsContract.AUTHORITY, op_list);
  }catch(Exception e){
   e.printStackTrace();
  }

尝试在 20 次迭代循环中运行这段代码,然后转到联系人应用程序 你会看到只有 8 个联系人挂在那里!! 当我插入重复的电子邮件、电话、组织时也会发生此问题。 从0->200循环尝试,android会发疯!

我的代码有问题吗?有什么解决办法吗?

任何帮助将不胜感激... 谢谢!

【问题讨论】:

    标签: android duplicates contacts


    【解决方案1】:

    经过 2 天不睡觉...重新阅读我的代码并重写我的课程 我找到了解决方案:有一个我不知道的列,它甚至在早期的 API 中都不存在:AGGREGATION_MODE

    所以解决办法是这样的:

        ArrayList<ContentProviderOperation> op_list = new ArrayList<ContentProviderOperation>();
             op_list.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
                 .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
                 .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
                 .withValue(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DISABLED)
    
                 .build());
    
          // first and last names
               op_list.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
           .withValueBackReference(Data.RAW_CONTACT_ID, 0)
                 .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
                 .withValue(StructuredName.GIVEN_NAME, "MyFirstName")
                 .withValue(StructuredName.FAMILY_NAME, "MyLastName")
                 .build());
    
          try{
           ContentProviderResult[] results = cResolver.applyBatch(ContactsContract.AUTHORITY, op_list);
          }catch(Exception e){
           e.printStackTrace();
          }
    

    【讨论】:

    • 你是我的英雄!!!。另一个关于 Android 文档真的很差的经典例子...... bha!再次感谢您。
    • 你拯救了我的一天老兄!
    • AGGREGATION_MODE_DISABLED 对我不起作用,我仍然可以使用此值聚合 rawContacts。这似乎是Android中的一个错误或什么的......
    【解决方案2】:

    联系人在新的 api (sdk >2.0) 中合并。

    属于特定规则集的所有联系人会自动合并以在联系人列表中显示单个联系人。

    这组规则包括 1. 具有相同名字和姓氏的联系人。 2.具有相同邮件ID的联系人。 3. 姓名和电话号码匹配的联系人...等。

    在显示联系人详细信息屏幕中,重复项不可见。 如果您尝试编辑联系人,您将找到您输入的联系人的所有实例。 (即如果一个联系人被输入 10 次,那么 10 个不同的实例一个接一个可见。)您可以在那里编辑任何特定的联系人。

    由于 Android 2.0 支持多个帐户,因此存在这种情况。

    【讨论】:

      【解决方案3】:

      您应该尝试使用 ContentResolver 直接插入,也许会有所帮助(我没有尝试插入 20 次相同的联系人,所以我不知道它是否会有所不同)

      【讨论】:

      • 奇怪...解释一下:当您尝试使用 20s 并获得 8s 时,如果您再次运行该应用程序,您是否可以再次添加一些记录?
      • 是的,我可以...如果我添加 10 个不同的新联系人,所有联系人都会添加...但如果我尝试添加更多重复联系人,则会添加少量联系人:S!跨度>
      • 好吧,你下次可以再添加一些,所以听起来contacts api不能一次插入那么多记录。您可以尝试在一个循环中添加 20 条不同的记录来测试它,这将显示问题是与同一联系人事物有关还是与多个联系人事物有关。但到目前为止,它看起来像第二个,所以你可以分批添加它们,一次 5-10 个 :)
      • 顺便说一句,contacts API 在 2.0 中有所不同,只是让你知道如果你不知道,当然是使用 ContactsContract
      • 嗯,是的,我当然知道 api 的差异,上个月一直在研究这个,呵呵......嗯,我之前尝试过添加不同的联系人(720 个不同的联系人),其中充满了字段(组织,手机,甚至有些有照片),它们都被成功添加了
      猜你喜欢
      • 1970-01-01
      • 2018-04-14
      • 2016-03-13
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      相关资源
      最近更新 更多