由于工作上的需要,把数据库中备份的联系人添加到通讯录,一般都有几百条记录,插入一条数据系统默认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<Tb_contacts> list) throws RemoteException, OperationApplicationException { GlobalConstants.PrintLog_D("[GlobalVariables->]BatchAddContact begin"); ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 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()); // } } }通过以上的对比,对于数据库效率就不一样了!