編輯:關於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()); // } } }
android 一個Activity多個listview
當我們直接在布局文件中寫三個listview的時候,會出現三個滾動條,並且每個listview都只顯示一個item,要改動才顯示更多。怎麼做才好了? 辦法是有得:用一
Android官方開發文檔Training系列課程中文版:通知用戶之在通知中顯示進度
原文地址:http://android.xsoftlab.net/training/notify-user/display-progress.html通知中包含了一個進度
屏幕適配之百分比方案詳解
最近看到DrawerLayout,support v4中提供的類,想到對google提供的這些支持庫,自己一點都不熟悉,想著看看Google提供的支持庫都有什麼內容。結果
AndroidUI組件之GridView
java 代碼如下(簡單的知識點我會以注釋的形式講解):package com.gc.gridviewdemo; /** * @author Android將軍 */