標籤:android 通話記錄 content_uri contentprovideropera
在前面有提到大量新增連絡人: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;}@Overridepublic 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