您的位置:首页 > 移动开发 > Android开发

Android实现批量添加联系人到通讯录

2014-05-27 17:47 288 查看

Android实现批量添加联系人到通讯录

[日期:2014-05-17]来源:Linux社区 作者:deng0zhaotai[字体:大 中 小]
由于工作上的需要,把数据库中备份的联系人添加到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);

}

二百多条记录差不多要七分钟

使用下面批量添加方法,不到两分钟

/**

* 批量添加通讯录

*

* @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());

// }

}

}

通过以上的对比,对于数据库效率就不一样了!

更多Android相关信息见Android 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=11

本文永久更新链接地址http://www.linuxidc.com/Linux/2014-05/101853.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: