由於工作上的需要,把數據庫中備份的聯系人添加到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