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

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

 /*** 单条添加数据* * @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;elsereturn 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;}@Overridepublic 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;elsereturn 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执行一个空值插入,目的是获取系统返回的rawContactIdUri 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批量添加联系人到通讯录相关推荐

  1. android批量添加联系人,Android实现批量添加联系人到通讯录

    由于工作上的需要,把数据库中备份的联系人添加到Android通讯录,一般都有几百条记录,插入一条数据系统默认commit一次,这样效率 由于工作上的需要,把数据库中备份的联系人添加到Android通讯 ...

  2. 手机号码批量导入通讯录php,iPhone8怎么批量导入通讯录?苹果8批量添加联系人教程...

    苹果8批量添加联系人教程 方法一: 1.首先我们需要在正式使用iPhone8之前,先将所有的通讯录联系人保存到SIM卡中,然后取出SIM卡安装到新iPhone8手机当中. 2.然后我们依次进入到iPh ...

  3. 批量添加联系人的方法

    说实话,我找了一整天的帖子,好像所有关于批量添加联系人的帖子都是复制一个人的! 然后那一个人又没说清楚. 以下是我做的,可能有不对! 实现功能就好吧.我感觉 API上,还有sample里面都有现成的, ...

  4. 华为Play 4T Pro批量添加联系人

           因本人比较懒,单位上有八十多号人,不想一个个去添加联系人,但现有的一些批量添加联系人的方法貌似都不怎么好用,故特意写了个针对华为Play 4t Pro批量添加联系人的软件:本软件已确认支 ...

  5. 微信小程序(3)—— 添加联系人至通讯录

    添加联系人至通讯录 我写的小功能是在点击联系人的时候,进行选择多种选择(拨打电话和添加联系人). 该功能必须在手机上运行才能体验最终效果. 代码参考并分析 wxml: <van-col span ...

  6. Android批量添加删除联系人

    项目中的一个小需求,需要批量导入电话号码进入手机里面,号段固定了,可以自己添加号段的选项 XML布局文件 <LinearLayout xmlns:android="http://sch ...

  7. 在Office365中批量添加联系人

    在O365中,联系人项没有提供批量导入的选项,需要一个一个添加.需要大批量添加时,无疑是一件很痛苦的事! 实际上,我们可以使用Windows PowerShell和CSV文件批量导入联系人.主要分为以 ...

  8. python实现批量添加联系人到手机通讯录+python可视化编程案例

    简要 本案例通过python+pandas实现提取excel工作表中的数据,并将其添加相关代码信息,再保存为txt,然后保存为后缀名为.vcf的通讯录备份文件,此文件可以直接使用手机自带通讯录软件打开 ...

  9. Android添加联系人到通讯录

    联系人名字 名字不知道为什么,值设置了之后传过去没有,于是自己通过 Intent 最后又单独传了一次 // 联系人名字 ContentValues row1 = new ContentValues() ...

最新文章

  1. 独家 | 为什么大多数分析工作都以失败告终
  2. 关于react中setState的深入理解
  3. sdut 2134 数据结构实验之栈与队列四:括号匹配
  4. 16线激光雷达配置教程
  5. 李彦宏妻子马东敏向中国科大捐赠1亿 成立蔷薇基金
  6. 【应用】Lambda表达式
  7. “strcpy” 模拟的实现
  8. ad用户和计算机无法启动,windows 2008AD计算机启动脚本无法执行
  9. API接口文档范文-API接口文档示例
  10. 第六次人口普查各地级市常住人口数量
  11. 哲学家名篇粤语诵读文2019年5月1日
  12. Java小白之编写:计算个税的程序
  13. 浏览器、html、css面试题(一)
  14. [附源码]java毕业设计逸尘房屋销售管理系统
  15. Centos7解决不能上网问题
  16. vue项目无法在IE浏览器中显示
  17. 解决Unable to open debugger port错误
  18. docxtpl 学习笔记
  19. error LNK2019 ,error LNK2001:无法解析的外部符号,LINK : fatal error LNK1104: 无法打开文件
  20. js内置对象中的String

热门文章

  1. Java面试题全集(上)-基础知识
  2. RSPO棕榈油供应链认证体系
  3. 后台模拟页面登陆_微信直播小程序后台,微信朋友圈可直达小程序直播了
  4. 七周成为数据分析师 | Excel
  5. css实现图片翘边阴影
  6. MacOS图标文件 .icns 一键生成脚本
  7. Fermat theorem (stationary points)
  8. day12-HTML、CSS与blog页面讲解
  9. unity urp 棉麻织物渲染
  10. 微信小程序实现拼团成功动画