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;
		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批量添加联系人到通讯录,布布扣,bubuko.com

时间: 2024-08-06 16:05:55

Android批量添加联系人到通讯录的相关文章

android批量添加联系人

研究生期间就没写过Java代码了,这几天由于想做一个统计网页词频的工具,但是使用C++不是很方便,于是又用Java做了一个小工具.翻开电脑中以前的文件,发现之前还做过一个android中批量添加联系人的工具,瞬间感觉好亲切,也感叹时间过得好快,一眨眼研究生就快要过完了. 记得当初做这个批量添加联系人的工具是刚来读研时,一大堆新同学的手机号码需要添加,班长整理出来同学们的通讯录后就得一个一个输入联系人和号码到手机中,想想这罪可有的受,于是就想能不能让手机直接读取xls格式(Excel格式)的文件到

Android批量添加通话记录

在前面有提到批量添加联系人:Android批量添加联系人到通讯录,通话记录和通讯录一样都是直接操作ContentProvider.为了使批量更新.插入.删除数据更加方便,android系统引入了 ContentProviderOperation类,使用ContentProviderOperation的理由 1.所有的操作都在一个事务中执行,这样可以保证数据完整性 2.由于批量操作在一个事务中执行,只需要打开和关闭一个事务,比多次打开关闭多个事务性能要好些 3.使用批量操作和多次单个操作相比,减少

Lync Server 2010批量添加联系人并同步联系人

最近一直帮助朋友整理Lync Server 2010,总是听他抱怨说微软的Lync不能实现组织结构等方面的联系人列表,其实也不完全没办法实现,早在OCS的年代,OCS利用Restkit tool工具进行添加联系人列表,而到了Lync的时代虽然Restkit Tool工具还在,但是已然无法利用之前的方式进行批量添加联系人了,在网上有人表示利用LyncAddContacts.vbs这个工具进行批量添加,但是所有的文章只是把国外这个作者的写的东西照抄过来并且翻译一下就成为原创发布到网络上,本人觉得现在

在Office365中批量添加联系人

在O365中,联系人项没有提供批量导入的选项,需要一个一个添加.需要大批量添加时,无疑是一件很痛苦的事! 实际上,我们可以使用Windows PowerShell和CSV文件批量导入联系人.主要分为以下四个步骤: 1.准备CSV文件. 2.建立PowerShell与O365的连接. 3.使用PowerShell命令导入联系人的必需信息. 4.使用PowerShell命令导入联系人的附加信息. 第一步,准备CSV文件 CSV文件的模板已经在附件中(ExternalContacts.rar).CSV

Android 查询 添加 修改 删除通讯录联系人示例

1.AndroidManifest.xml中添加权限 <uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission> <uses-permission android:name="android.permission.WRITE_CONTACTS"></uses-permission> 2.布局 <?xml v

Android软件开发之通讯录——添加联系人以及SQLite工具的简单使用

关于通讯录获取联系人信息以及联系人信息的存储结构,下面链接的博客的博主已经简单说明: http://blog.csdn.net/snwrking/article/detail/7601794 ---------------------------------------------------------------------------------------------------------------------------------- 回归正题,我是用真机进行测试,首先先用数据线连

Android通讯录模糊查询搜索(号码,姓名,首字母简拼,全拼),批量选取联系人

Android通讯录模糊查询搜索(号码,姓名,首字母简拼,全拼),批量选取联系人 公司最近的项目中遇到一个需求需要读取通讯录联系人,并需要支持对联系人的模糊查询及批量选取,网上找了好几个例子,模糊查询这块处理的都有点小瑕疵,最终自己在各位网友的辛勤贡献基础之上进行了优化,最终做出了联系人模糊查询. 支持以下功能: 1.按 号码 , 姓名 , 首字母简拼 , 全拼 模糊查询 2.支持[A-Z]快速导航 3.支持联系人按首字母分类 4.支持联系人批量选取. 具体github地址:  https://

【Android】从通讯录添加联系人——一个你不知道的细节

1原因: 在开发的时候我们经常会遇到从通讯录添加联系人的功能,但是突然有一天有人告诉我说我的通讯录添加里没有SIM卡联系人,而别人的有,这就让我很纳闷,什么情况,最后才发现了原因,记录下. 2解决方案: 这是可以选择SIM卡联系人的代码: private void OpenPhoneNum() { Intent intent = new Intent(Intent.ACTION_PICK, CommonDataKinds.Phone.CONTENT_URI); startActivityForR

Android 增,删,改,查 通讯录中的联系人

一.权限 操作通讯录必须在AndroidManifest.xml中先添加2个权限, <uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission> <uses-permission android:name="android.permission.WRITE_CONTACTS"></uses-permission>