Android批量添加通话记录

在前面有提到批量添加联系人:Android批量添加联系人到通讯录,通话记录和通讯录一样都是直接操作ContentProvider。为了使批量更新、插入、删除数据更加方便,android系统引入了 ContentProviderOperation类,使用ContentProviderOperation的理由

1.所有的操作都在一个事务中执行,这样可以保证数据完整性
2.由于批量操作在一个事务中执行,只需要打开和关闭一个事务,比多次打开关闭多个事务性能要好些
3.使用批量操作和多次单个操作相比,减少了应用和content provider之间的上下文切换,这样也会提升应用的性能,并且减少占用CPU的时间,当然也会减少电量的消耗。

首先定义一个通话记录的实体类

package com.csr.BTApp.apical.domain;

public class Tb_calllogs {
	private String mNumber; // 号码
	private String mName; // 在通讯录中的联系人
	private int mCallLogType; // 通话记录的状态 1:来电 2:去电 3:未接
	private Long mCallLogDate; // 通话记录日期
	private int mCallLogDuration; // 通话记录时长

	public Tb_calllogs() {

	}

	public Tb_calllogs(String mNumber, String mName, int mCallLogType,
			Long mCallLogDate, int mCallLogDuration) {
		super();
		this.mNumber = mNumber;
		this.mName = mName;
		this.mCallLogType = mCallLogType;
		this.mCallLogDate = mCallLogDate;
		this.mCallLogDuration = mCallLogDuration;
	}

	public String getmNumber() {
		return mNumber;
	}

	public void setmNumber(String mNumber) {
		this.mNumber = mNumber;
	}

	public String getmName() {
		return mName;
	}

	public void setmName(String mName) {
		this.mName = mName;
	}

	public int getmCallLogType() {
		return mCallLogType;
	}

	public void setmCallLogType(int mCallLogType) {
		this.mCallLogType = mCallLogType;
	}

	public Long getmCallLogDate() {
		return mCallLogDate;
	}

	public void setmCallLogDate(Long mCallLogDate) {
		this.mCallLogDate = mCallLogDate;
	}

	public int getmCallLogDuration() {
		return mCallLogDuration;
	}

	public void setmCallLogDuration(int mCallLogDuration) {
		this.mCallLogDuration = mCallLogDuration;
	}

	@Override
	public String toString() {
		return "Tb_calllogs [mNumber=" + mNumber + ", mName=" + mName
				+ ", mCallLogType=" + mCallLogType + ", mCallLogDate="
				+ mCallLogDate + ", mCallLogDuration=" + mCallLogDuration + "]";
	}
}

添加单条通话记录

	/**
	 * 往数据库中新增通话记录
	 * 
	 * @param name
	 * @param number
	 */
	public static void AddCallLogs(Tb_calllogs calllog) {
		ContentValues values = new ContentValues();
		values.clear();
		values.put(CallLog.Calls.CACHED_NAME, calllog.getmName());
		values.put(CallLog.Calls.NUMBER, calllog.getmNumber());
		values.put(CallLog.Calls.TYPE, calllog.getmCallLogType());
		values.put(CallLog.Calls.DATE, calllog.getmCallLogDate());
		values.put(CallLog.Calls.DURATION, calllog.getmCallLogDuration());
		values.put(CallLog.Calls.NEW, "0");// 0已看1未看 ,由于没有获取默认全为已读
		mContext.getContentResolver().insert(CallLog.Calls.CONTENT_URI, values);
	}
批量操作

	public static void BatchAddCallLogs(List<Tb_calllogs> list)
			throws RemoteException, OperationApplicationException {
		GlobalConstants.PrintLog_D("[GlobalVariables->]BatchAddCallLogs begin");
		ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
		ContentValues values = new ContentValues();

		for (Tb_calllogs calllog : list) {
			values.clear();
			values.put(CallLog.Calls.CACHED_NAME, calllog.getmName());
			values.put(CallLog.Calls.NUMBER, calllog.getmNumber());
			values.put(CallLog.Calls.TYPE, calllog.getmCallLogType());
			values.put(CallLog.Calls.DATE, calllog.getmCallLogDate());
			values.put(CallLog.Calls.DURATION, calllog.getmCallLogDuration());
			values.put(CallLog.Calls.NEW, "0");// 0已看1未看 ,由于没有获取默认全为已读
			ops.add(ContentProviderOperation
					.newInsert(CallLog.Calls.CONTENT_URI).withValues(values)
					.withYieldAllowed(true).build());
		}
		if (ops != null) {
			// 真正添加
			ContentProviderResult[] results = mContext.getContentResolver()
					.applyBatch(CallLog.AUTHORITY, ops);

			// for (ContentProviderResult result : results) {
			// GlobalConstants
			// .PrintLog_D("[GlobalVariables->]BatchAddCallLogs "
			// + result.uri.toString());
			// }
		}
	}
传入list遍历所有的list后,添加到ContentProviderOperation最后才调用applyBatch效率会高很多。

参考文章:http://blog.chengyunfeng.com/?p=517



Android批量添加通话记录,,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。