Android实现批量添加联系人到通讯录

Android实现批量添加联系人到通讯录

[日期:2014-05-17]来源:Linux社区  作者:deng0zhaotai[字体:  ]

由于工作上的需要,把数据库中备份的联系人添加到Android通讯录,一般都有几百条记录,插入一条数据系统默认commit一次,这样效率就降低了,如果把所有的数据都添加进去后再commit效率就不一样,这就需要事务。

Ubuntu 14.04 x64配置Android 4.4 kitkat编译环境的方法 http://www.linuxidc.com/Linux/2014-05/101148.htm

Ubuntu 12.04搭建Android开发环境 http://www.linuxidc.com/Linux/2012-09/69961.htm

Ubuntu 14.04 配置 Android SDK 开发环境 http://www.linuxidc.com/Linux/2014-05/101039.htm

64位Ubuntu 11.10下Android开发环境的搭建(JDK+Eclipse+ADT+Android SDK详细) http://www.linuxidc.com/Linux/2013-06/85303.htm

Ubuntu 12.10 x64 安装 Android SDK http://www.linuxidc.com/Linux/2013-03/82005.htm

没有添加事务的方法,每次添加一条记录

 /**
  * 单条添加数据
  * 
  * @param contacts
  * @return
  */
 public boolean add(Tb_contacts contacts) {
  SQLiteDatabase db = helper.getWritableDatabase();
  ContentValues values = new ContentValues();
  values.put("name", contacts.getName());
  values.put("number", contacts.getNumber());
  long result = db.insert("tb_contacts", null, values);
  GlobalConstants.PrintLog_D("[ContactsDAO->add] result = " + result);
  db.close();
  if (result != -1)
   return true;
  else
   return false;
 }

Tb_contacts是实体类

public class Tb_contacts {
 private String name;
 private String number;

 public Tb_contacts() {
  super();
 }

 public Tb_contacts(String name, String number) {
  super();
  this.name = name;
  this.number = number;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public String getNumber() {
  return number;
 }

 public void setNumber(String number) {
  this.number = number;
 }

 @Override
 public String toString() {
  return "Tb_contacts [name=" + name + ", number=" + number + "]";
 }

}

添加二百多条记录要两分多钟
 
看下面这种方法

/**
  * 批量添加数据
  * 
  * @param cursor
  * @return
  */
 public boolean add(Cursor cursor) {
  SQLiteDatabase db = helper.getWritableDatabase();
  long result = 0;
  db.beginTransaction();
  while (cursor.moveToNext()) {
   ContentValues values = new ContentValues();
   String contactname = cursor.getString(cursor
     .getColumnIndex(Phone.DISPLAY_NAME));
   String contactnumber = cursor.getString(cursor
     .getColumnIndex(Phone.NUMBER));
   values.put("name", contactname);
   values.put("number", contactnumber);
   result = db.insert("tb_contacts", null, values);
   GlobalConstants.PrintLog_D("[ContactsDAO->add] cursor result = "
     + result + " number = " + contactnumber);
  }
  db.setTransactionSuccessful(); // 设置事务处理成功,不设置会自动回滚不提交
  db.endTransaction();
  cursor.close();
  db.close();
  if (result != -1)
   return true;
  else
   return false;
 }

传入的参数是查询得到的数据

Cursor contactsCursor = getActivity().getContentResolver().query(
     Phone.CONTENT_URI, null, null, null, null); // 读取联系人
   contacts.add(contactsCursor);

同样的数据只要十几秒就可以了,关键就这几句话
 
1.db.beginTransaction(); 循环之前开启事务
2.db.setTransactionSuccessful(); 循环结束后调用
3.db.endTransaction();最后释放事务
以上是对一般数据库的操作,对通讯录有专门的ContentProvider批量操作
 
先看一条一条记录操作

 /**
  * 往数据库中新增联系人
  * 
  * @param name
  * @param number
  */
 public static void AddContact(String name, String number) {

  ContentValues values = new ContentValues();
  // 首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId
  Uri rawContactUri = mContext.getContentResolver().insert(
    RawContacts.CONTENT_URI, values);
  long rawContactId = ContentUris.parseId(rawContactUri);
  // 往data表插入姓名数据
  values.clear();
  values.put(Data.RAW_CONTACT_ID, rawContactId);
  values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);// 内容类型
  values.put(StructuredName.GIVEN_NAME, name);
  mContext.getContentResolver().insert(ContactsContract.Data.CONTENT_URI,
    values);

  // 往data表插入电话数据
  values.clear();
  values.put(Data.RAW_CONTACT_ID, rawContactId);
  values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
  values.put(Phone.NUMBER, number);
  values.put(Phone.TYPE, Phone.TYPE_MOBILE);
  mContext.getContentResolver().insert(ContactsContract.Data.CONTENT_URI,
    values);
 }


二百多条记录差不多要七分钟
 
使用下面批量添加方法,不到两分钟

/**
  * 批量添加通讯录
  * 
  * @throws OperationApplicationException
  * @throws RemoteException
  */
 public static void BatchAddContact(List<Tb_contacts> list)
   throws RemoteException, OperationApplicationException {
  GlobalConstants.PrintLog_D("[GlobalVariables->]BatchAddContact begin");
  ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
  int rawContactInsertIndex = 0;
  for (Tb_contacts contact : list) {
   rawContactInsertIndex = ops.size(); // 有了它才能给真正的实现批量添加

   ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
     .withValue(RawContacts.ACCOUNT_TYPE, null)
     .withValue(RawContacts.ACCOUNT_NAME, null)
     .withYieldAllowed(true).build());

   // 添加姓名
   ops.add(ContentProviderOperation
     .newInsert(
       Android.provider.ContactsContract.Data.CONTENT_URI)
     .withValueBackReference(Data.RAW_CONTACT_ID,
       rawContactInsertIndex)
     .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
     .withValue(StructuredName.DISPLAY_NAME, contact.getName())
     .withYieldAllowed(true).build());
   // 添加号码
   ops.add(ContentProviderOperation
     .newInsert(
       android.provider.ContactsContract.Data.CONTENT_URI)
     .withValueBackReference(Data.RAW_CONTACT_ID,
       rawContactInsertIndex)
     .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
     .withValue(Phone.NUMBER, contact.getNumber())
     .withValue(Phone.TYPE, Phone.TYPE_MOBILE)
     .withValue(Phone.LABEL, "").withYieldAllowed(true).build());
  }
  if (ops != null) {
   // 真正添加
   ContentProviderResult[] results = mContext.getContentResolver()
     .applyBatch(ContactsContract.AUTHORITY, ops);
   // for (ContentProviderResult result : results) {
   // GlobalConstants
   // .PrintLog_D("[GlobalVariables->]BatchAddContact "
   // + result.uri.toString());
   // }
  }
 }

通过以上的对比,对于数据库效率就不一样了!

更多Android相关信息见Android 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=11

本文永久更新链接地址http://www.linuxidc.com/Linux/2014-05/101853.htm


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中实现Android通讯录批量导入可以通过以下步骤进行: 1. 解析待导入的通讯录文件:首先,需要读取待导入的通讯录文件,通常是一个Excel或CSV文件。利用Java中的文件读取类库,例如Apache POI或OpenCSV,可以轻松地实现通讯录文件的解析。 2. 创建联系人模型:在Java中,可以创建一个联系人模型类来表示通讯录中的每个联系人。该模型类可以包含联系人的姓名、电话号码、邮箱等基本信息。通过创建该模型类,可以方便地存储和操作每个联系人的信息。 3. 解析联系人信息并存储:在解析通讯录文件时,需要逐行读取文件内容,并将每行中的联系人信息提取出来。根据联系人模型,可以创建对应的联系人对象,并将解析到的信息存储在对象中。然后,可以选择将所有的联系人对象存储在一个集合中,例如ArrayList。 4. 导入联系人信息到Android系统:在Android中,可以使用ContentProvider来实现通讯录的增、删、改、查操作。使用Java中的ContentResolver类,可以通过调用相应的方法将解析到的联系人信息批量导入到Android通讯录中。可以使用ContentValues类来存储联系人信息,并使用ContentResolver的insert方法将联系人信息插入到对应的Android通讯录表中。 需要注意的是,实现通讯录导入时还需要处理异常情况,例如文件不存在、文件格式错误等。可以使用try-catch语句捕获这些异常,并给出相应的提示或错误信息。 通过以上步骤,就可以在Java中实现Android通讯录批量导入功能。这样用户可以方便地将其他平台或系统中的通讯录数据快速导入到Android设备中,提供了更好的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值