Android批量添加联系人到通讯录
由于工作上的需要,把数据库中备份的联系人添加到通讯录,一般都有几百条记录,插入一条数据系统默认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批量添加联系人到通讯录相关推荐
- android批量添加联系人,Android实现批量添加联系人到通讯录
由于工作上的需要,把数据库中备份的联系人添加到Android通讯录,一般都有几百条记录,插入一条数据系统默认commit一次,这样效率 由于工作上的需要,把数据库中备份的联系人添加到Android通讯 ...
- 手机号码批量导入通讯录php,iPhone8怎么批量导入通讯录?苹果8批量添加联系人教程...
苹果8批量添加联系人教程 方法一: 1.首先我们需要在正式使用iPhone8之前,先将所有的通讯录联系人保存到SIM卡中,然后取出SIM卡安装到新iPhone8手机当中. 2.然后我们依次进入到iPh ...
- 批量添加联系人的方法
说实话,我找了一整天的帖子,好像所有关于批量添加联系人的帖子都是复制一个人的! 然后那一个人又没说清楚. 以下是我做的,可能有不对! 实现功能就好吧.我感觉 API上,还有sample里面都有现成的, ...
- 华为Play 4T Pro批量添加联系人
因本人比较懒,单位上有八十多号人,不想一个个去添加联系人,但现有的一些批量添加联系人的方法貌似都不怎么好用,故特意写了个针对华为Play 4t Pro批量添加联系人的软件:本软件已确认支 ...
- 微信小程序(3)—— 添加联系人至通讯录
添加联系人至通讯录 我写的小功能是在点击联系人的时候,进行选择多种选择(拨打电话和添加联系人). 该功能必须在手机上运行才能体验最终效果. 代码参考并分析 wxml: <van-col span ...
- Android批量添加删除联系人
项目中的一个小需求,需要批量导入电话号码进入手机里面,号段固定了,可以自己添加号段的选项 XML布局文件 <LinearLayout xmlns:android="http://sch ...
- 在Office365中批量添加联系人
在O365中,联系人项没有提供批量导入的选项,需要一个一个添加.需要大批量添加时,无疑是一件很痛苦的事! 实际上,我们可以使用Windows PowerShell和CSV文件批量导入联系人.主要分为以 ...
- python实现批量添加联系人到手机通讯录+python可视化编程案例
简要 本案例通过python+pandas实现提取excel工作表中的数据,并将其添加相关代码信息,再保存为txt,然后保存为后缀名为.vcf的通讯录备份文件,此文件可以直接使用手机自带通讯录软件打开 ...
- Android添加联系人到通讯录
联系人名字 名字不知道为什么,值设置了之后传过去没有,于是自己通过 Intent 最后又单独传了一次 // 联系人名字 ContentValues row1 = new ContentValues() ...
最新文章
- 独家 | 为什么大多数分析工作都以失败告终
- 关于react中setState的深入理解
- sdut 2134 数据结构实验之栈与队列四:括号匹配
- 16线激光雷达配置教程
- 李彦宏妻子马东敏向中国科大捐赠1亿 成立蔷薇基金
- 【应用】Lambda表达式
- “strcpy” 模拟的实现
- ad用户和计算机无法启动,windows 2008AD计算机启动脚本无法执行
- API接口文档范文-API接口文档示例
- 第六次人口普查各地级市常住人口数量
- 哲学家名篇粤语诵读文2019年5月1日
- Java小白之编写:计算个税的程序
- 浏览器、html、css面试题(一)
- [附源码]java毕业设计逸尘房屋销售管理系统
- Centos7解决不能上网问题
- vue项目无法在IE浏览器中显示
- 解决Unable to open debugger port错误
- docxtpl 学习笔记
- error LNK2019 ,error LNK2001:无法解析的外部符号,LINK : fatal error LNK1104: 无法打开文件
- js内置对象中的String