android批量添加联系人,Android批量添加联系人到通讯录
由于工作上的需要,把数据库中备份的联系人添加到通讯录,一般都有几百条记录,插入一条数据系统默认commit一次,这样效率就降低了,如果把所有的数据都添加进去后再commit效率就不一样,这就需要事务没有添加事务的方法,每次添加一条记录/*** 单条添加数据** @param contacts* @return*/public boolean add(Tb_contacts contacts) {S
由于工作上的需要,把数据库中备份的联系人添加到通讯录,一般都有几百条记录,插入一条数据系统默认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());
// }
}
}通过以上的对比,对于数据库效率就不一样了!
更多推荐
所有评论(0)