2012-08-09 99 views
2

我想从我的应用程序添加多个联系人。我正在读取来自xml文件的数据,然后将其包装到强类型对象的列表中。这些对象,然后循环,我打电话插入到每个用户的联系人。在Android 2.3.5插入多个联系人

但是,我在测试我得到1或2个工作联系人,然后是一些空的(未知)条目的同时,我得到了一些非常奇怪的结果。 (Unknowns)上的成功条目似乎是随机的,但我为什么不能执行应该相当简单的事情而处于失败状态。

我的点击事件启动命令来获取数据,然后将其添加到联系人是下面。我可以确认每次都将数据读入联系人列表中,因此这不会造成数据问题。

public void onClick(View v) { 
    List<AddressContent> contacts = GetAddresses();  
    int counter = 0;   

    if (!contacts.isEmpty()) {     
     ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 

     for (int i = 0; i < contacts.size(); i++) {    

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

      // ------------------------------------------------------ Name 

      ops.add(ContentProviderOperation 
        .newInsert(ContactsContract.Data.CONTENT_URI) 
        .withValueBackReference(
          ContactsContract.Data.RAW_CONTACT_ID, i) 
        .withValue(
          ContactsContract.Data.MIMETYPE, 
          ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) 
        .withValue(
          ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, 
          contacts.get(i).getName()).build()); 

      // ------------------------------------------------------ Work 
      // Number 

      ops.add(ContentProviderOperation 
        .newInsert(ContactsContract.Data.CONTENT_URI) 
        .withValueBackReference(
          ContactsContract.Data.RAW_CONTACT_ID, i) 
        .withValue(
          ContactsContract.Data.MIMETYPE, 
          ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) 
        .withValue(
          ContactsContract.CommonDataKinds.Phone.NUMBER, 
          contacts.get(i).getPhone()) 
        .withValue(
          ContactsContract.CommonDataKinds.Phone.TYPE, 
          ContactsContract.CommonDataKinds.Phone.TYPE_WORK) 
        .build()); 

      // ------------------------------------------------------ Fax 
      // Number 

      ops.add(ContentProviderOperation 
        .newInsert(ContactsContract.Data.CONTENT_URI) 
        .withValueBackReference(
          ContactsContract.Data.RAW_CONTACT_ID, i) 
        .withValue(
          ContactsContract.Data.MIMETYPE, 
          ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) 
        .withValue(
          ContactsContract.CommonDataKinds.Phone.NUMBER, 
          contacts.get(i).getFax()) 
        .withValue(
          ContactsContract.CommonDataKinds.Phone.TYPE, 
          ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK) 
        .build()); 

      // ------------------------------------------------------ Email 

      ops.add(ContentProviderOperation 
        .newInsert(ContactsContract.Data.CONTENT_URI) 
        .withValueBackReference(
          ContactsContract.Data.RAW_CONTACT_ID, i) 
        .withValue(
          ContactsContract.Data.MIMETYPE, 
          ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) 
        .withValue(ContactsContract.CommonDataKinds.Email.DATA, 
          contacts.get(i).getEmail()) 
        .withValue(
          ContactsContract.CommonDataKinds.Email.TYPE, 
          ContactsContract.CommonDataKinds.Email.TYPE_WORK) 
        .build()); 

      // ------------------------------------------------------ 
      // Organisation 

      ops.add(ContentProviderOperation 
        .newInsert(ContactsContract.Data.CONTENT_URI) 
        .withValueBackReference(
          ContactsContract.Data.RAW_CONTACT_ID, i) 
        .withValue(
          ContactsContract.Data.MIMETYPE, 
          ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE) 
        .withValue(
          ContactsContract.CommonDataKinds.Organization.COMPANY, 
          contacts.get(i).getCompany()) 
        .withValue(
          ContactsContract.CommonDataKinds.Organization.TYPE, 
          ContactsContract.CommonDataKinds.Organization.TYPE_WORK) 
        .build()); 

      // ------------------------------------------------------ 
      // Address    

      ops.add(ContentProviderOperation 
        .newInsert(ContactsContract.Data.CONTENT_URI) 
        .withValueBackReference(
          ContactsContract.Data.RAW_CONTACT_ID, i) 
        .withValue(
          ContactsContract.Data.MIMETYPE, 
          ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE) 
        .withValue(
          ContactsContract.CommonDataKinds.StructuredPostal.STREET, 
          contacts.get(i).getStreet()) 
        .withValue(
          ContactsContract.CommonDataKinds.StructuredPostal.CITY, 
          contacts.get(i).getCity()) 
        .withValue(
          ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, 
          contacts.get(i).getPostcode()) 
        .withValue(
          ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, 
          contacts.get(i).getCountry()) 
        .withValue(
          ContactsContract.CommonDataKinds.StructuredPostal.TYPE, 
          ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK) 
        .build()); 
      counter++; 
     } 

     try { 
      getContentResolver().applyBatch(ContactsContract.AUTHORITY, 
        ops); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      Toast.makeText(this, "Error adding contact", Toast.LENGTH_SHORT).show(); 
      counter--; 
     } 

     if (counter > 0) { 
      if (counter > 1) { 
       Toast.makeText(this, "Contacts added", Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(this, "Contact added", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 

    if (counter == 0) { 
     Toast.makeText(this, "Unable to add contact", Toast.LENGTH_SHORT).show(); 
    } 
} 

回答

2

在经历了许多混乱之后,我发现我需要循环,然后每次都发射。我不能简单地建立数组列表并像上面那样激发一次。下面的代码工作:

public void onClick(View v) { 
List<AddressContent> contacts = GetAddresses();  
int counter = 0;   

if (!contacts.isEmpty()) {     


    for (int i = 0; i < contacts.size(); i++) {    
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 
     ops.add(ContentProviderOperation 
       .newInsert(ContactsContract.RawContacts.CONTENT_URI) 
       .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, 
         null) 
       .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, 
         null) 
       .withValue(ContactsContract.RawContacts.AGGREGATION_MODE, 
         ContactsContract.RawContacts.AGGREGATION_MODE_DISABLED).build()); 

     // ------------------------------------------------------ Name 

     ops.add(ContentProviderOperation 
       .newInsert(ContactsContract.Data.CONTENT_URI) 
       .withValueBackReference(
         ContactsContract.Data.RAW_CONTACT_ID, i) 
       .withValue(
         ContactsContract.Data.MIMETYPE, 
         ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) 
       .withValue(
         ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, 
         contacts.get(i).getName()).build()); 

     // ------------------------------------------------------ Work 
     // Number 

     ops.add(ContentProviderOperation 
       .newInsert(ContactsContract.Data.CONTENT_URI) 
       .withValueBackReference(
         ContactsContract.Data.RAW_CONTACT_ID, i) 
       .withValue(
         ContactsContract.Data.MIMETYPE, 
         ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) 
       .withValue(
         ContactsContract.CommonDataKinds.Phone.NUMBER, 
         contacts.get(i).getPhone()) 
       .withValue(
         ContactsContract.CommonDataKinds.Phone.TYPE, 
         ContactsContract.CommonDataKinds.Phone.TYPE_WORK) 
       .build()); 

     // ------------------------------------------------------ Fax 
     // Number 

     ops.add(ContentProviderOperation 
       .newInsert(ContactsContract.Data.CONTENT_URI) 
       .withValueBackReference(
         ContactsContract.Data.RAW_CONTACT_ID, i) 
       .withValue(
         ContactsContract.Data.MIMETYPE, 
         ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) 
       .withValue(
         ContactsContract.CommonDataKinds.Phone.NUMBER, 
         contacts.get(i).getFax()) 
       .withValue(
         ContactsContract.CommonDataKinds.Phone.TYPE, 
         ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK) 
       .build()); 

     // ------------------------------------------------------ Email 

     ops.add(ContentProviderOperation 
       .newInsert(ContactsContract.Data.CONTENT_URI) 
       .withValueBackReference(
         ContactsContract.Data.RAW_CONTACT_ID, i) 
       .withValue(
         ContactsContract.Data.MIMETYPE, 
         ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) 
       .withValue(ContactsContract.CommonDataKinds.Email.DATA, 
         contacts.get(i).getEmail()) 
       .withValue(
         ContactsContract.CommonDataKinds.Email.TYPE, 
         ContactsContract.CommonDataKinds.Email.TYPE_WORK) 
       .build()); 

     // ------------------------------------------------------ 
     // Organisation 

     ops.add(ContentProviderOperation 
       .newInsert(ContactsContract.Data.CONTENT_URI) 
       .withValueBackReference(
         ContactsContract.Data.RAW_CONTACT_ID, i) 
       .withValue(
         ContactsContract.Data.MIMETYPE, 
         ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE) 
       .withValue(
         ContactsContract.CommonDataKinds.Organization.COMPANY, 
         contacts.get(i).getCompany()) 
       .withValue(
         ContactsContract.CommonDataKinds.Organization.TYPE, 
         ContactsContract.CommonDataKinds.Organization.TYPE_WORK) 
       .build()); 

     // ------------------------------------------------------ 
     // Address    

     ops.add(ContentProviderOperation 
       .newInsert(ContactsContract.Data.CONTENT_URI) 
       .withValueBackReference(
         ContactsContract.Data.RAW_CONTACT_ID, i) 
       .withValue(
         ContactsContract.Data.MIMETYPE, 
         ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE) 
       .withValue(
         ContactsContract.CommonDataKinds.StructuredPostal.STREET, 
         contacts.get(i).getStreet()) 
       .withValue(
         ContactsContract.CommonDataKinds.StructuredPostal.CITY, 
         contacts.get(i).getCity()) 
       .withValue(
         ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, 
         contacts.get(i).getPostcode()) 
       .withValue(
         ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, 
         contacts.get(i).getCountry()) 
       .withValue(
         ContactsContract.CommonDataKinds.StructuredPostal.TYPE, 
         ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK) 
       .build()); 

    try { 
     getContentResolver().applyBatch(ContactsContract.AUTHORITY, 
       ops); 
counter++; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     Toast.makeText(this, "Error adding contact", Toast.LENGTH_SHORT).show(); 
     counter--; 
    } 
    } 



    if (counter > 0) { 
     if (counter > 1) { 
      Toast.makeText(this, "Contacts added", Toast.LENGTH_SHORT).show(); 
     } else { 
      Toast.makeText(this, "Contact added", Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

if (counter == 0) { 
    Toast.makeText(this, "Unable to add contact", Toast.LENGTH_SHORT).show(); 
} 

}

0

上面的回答是不正确的,你可以在一次只要你设置正确的反向引用ID这样插入多个联系人:

int backReference; 
    ArrayList<ContentProviderOperation> ops = new ArrayList<>(); 
    for (int i = 0; i < contacts.size(); i++) { 
     Contact contact = contacts.get(i); 
     backReference = ops.size(); 
     ops.add(ContentProviderOperation.newInsert(addCallerIsSyncAdapterParameter(RawContacts.CONTENT_URI, true)) 
       .withYieldAllowed(true) 
       .withValue(RawContacts.ACCOUNT_NAME, contact.fullName) 
       .withValue(RawContacts.ACCOUNT_TYPE, ACCOUNT_TYPE) 
       .withValue(RawContacts.SOURCE_ID, contact.contactId) 
       .build()); 

     ops.add(ContentProviderOperation.newInsert(addCallerIsSyncAdapterParameter(ContactsContract.Settings.CONTENT_URI, true)) 
       .withValue(RawContacts.ACCOUNT_NAME, contact.fullName) 
       .withValue(RawContacts.ACCOUNT_TYPE, ACCOUNT_TYPE) 
       .withValue(ContactsContract.Settings.UNGROUPED_VISIBLE, 1) 
       .build()); 

     ops.add(ContentProviderOperation.newInsert(addCallerIsSyncAdapterParameter(Data.CONTENT_URI, true)) 
       .withValueBackReference(Data.RAW_CONTACT_ID, backReference) 
       .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) 
       .withValue(StructuredName.GIVEN_NAME, contact.firstName) 
       .withValue(StructuredName.DISPLAY_NAME, contact.fullName) 
       .withValue(StructuredName.FAMILY_NAME, ((contact.preposition != null && !contact.preposition.equals("")) ? contact.preposition + " " : "") + contact.lastName) 
       .build()); 


     for (Number number : contact.numbers) { 
      ops.add(ContentProviderOperation.newInsert(addCallerIsSyncAdapterParameter(Data.CONTENT_URI, true)) 
        .withValueBackReference(Data.RAW_CONTACT_ID, backReference) 
        .withValue(Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) 
        .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM) 
        .withValue(ContactsContract.CommonDataKinds.Phone.LABEL, TYPE) 
        .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, number.number) 
        .build()); 
     } 

     for (Email email : contact.emails) { 
      ops.add(ContentProviderOperation.newInsert(addCallerIsSyncAdapterParameter(Data.CONTENT_URI, true)) 
        .withValueBackReference(Data.RAW_CONTACT_ID, backReference) 
        .withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE) 
        .withValue(Email.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM) 
        .withValue(Email.DATA, email.email) 
        .withValue(Email.LABEL, TYPE) 
        .build()); 
     } 
     if (contacts.size() > i+1 && ops.size() + contacts.get(i+1).getTotalInsertions() > 499) { 
      try { 
       resolver.applyBatch(ContactsContract.AUTHORITY, ops); 
      } 
      catch (Exception e) { 
       e.printStackTrace(); 
      } 
      ops.clear(); 
     } else if (contacts.size() == i+1) { 
      try { 
       resolver.applyBatch(ContactsContract.AUTHORITY, ops); 
      } 
      catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
相关问题