Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android批量添加聯系人到通訊錄

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 list)
			throws RemoteException, OperationApplicationException {
		GlobalConstants.PrintLog_D("[GlobalVariables->]BatchAddContact begin");
		ArrayList ops = new ArrayList();
		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());
			// }
		}
	}
通過以上的對比,對於數據庫效率就不一樣了!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved