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