首页 > 代码库 > Android批量添加联系人到通讯录

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());
			// }
		}
	}
通过以上的对比,对于数据库效率就不一样了!