歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android實現批量添加聯系人到通訊錄

由於工作上的需要,把數據庫中備份的聯系人添加到Android通訊錄,一般都有幾百條記錄,插入一條數據系統默認commit一次,這樣效率就降低了,如果把所有的數據都添加進去後再commit效率就不一樣,這就需要事務。

Ubuntu 14.04 x64配置Android 4.4 kitkat編譯環境的方法 http://www.linuxidc.com/Linux/2014-05/101148.htm

Ubuntu 12.04搭建Android開發環境 http://www.linuxidc.com/Linux/2012-09/69961.htm

Ubuntu 14.04 配置 Android SDK 開發環境 http://www.linuxidc.com/Linux/2014-05/101039.htm

64位Ubuntu 11.10下Android開發環境的搭建(JDK+Eclipse+ADT+Android SDK詳細) http://www.linuxidc.com/Linux/2013-06/85303.htm

Ubuntu 12.10 x64 安裝 Android SDK http://www.linuxidc.com/Linux/2013-03/82005.htm

沒有添加事務的方法,每次添加一條記錄

 /**
  * 單條添加數據
  *
  * @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);
 }

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-05/1018p2.htm

Copyright © Linux教程網 All Rights Reserved