AsyncQueryHandler

官方解释是一个异步帮助类(A helper class to help make handling asynchronous ContentResolver queries easier.) 。这个类的主要作用就是异步对DB数据库进行操作,加快其数据处理的速度(这个非常重要,特别是大容量的数据处理时,例如几千联系人的数据读取,按正常的处理速度会非常的慢,使用AsyncQueryHandler,这就会大大的加快速度,增加用户的良好体验)。

AsyncQueryHandler重要的方法:

final void startDelete(int token, Object cookie, Uri uri, String selection, String[] selectionArgs)

This method begins an asynchronous delete.
final void startInsert(int token, Object cookie, Uri uri, ContentValues initialValues)

This method begins an asynchronous insert.
void startQuery(int token, Object cookie, Uri uri, String[] projection, String selection, String[] selectionArgs, String orderBy)

This method begins an asynchronous query.
final void startUpdate(int token, Object cookie, Uri uri, ContentValues values, String selection, String[] selectionArgs)

This method begins an asynchronous update.

显然,从方法的名字,我们可以看出,这是使用异步方式对DB数据库进行基本的增,删,改,查。

void onDeleteComplete(int token, Object cookie, int result)

Called when an asynchronous delete is completed.
void onInsertComplete(int token, Object cookie, Uri uri)

Called when an asynchronous insert is completed.
void onQueryComplete(int token, Object cookie, Cursor cursor)

Called when an asynchronous query is completed.
void onUpdateComplete(int token, Object cookie, int result)

Called when an asynchronous update is completed.

这几个方法,分别对应于上面四个异步操作时的回调方法。

AsyncQueryHandler的一个应用:读取电话联系人的数据信息

[java] view
plain
copy

 
  1. public class TestAsyncQueryHandler extends Activity {
  2. private static final String NAME = "name", NUMBER = "number", SORT_KEY = "sort_key";
  3. private List<ContentValues> listData;
  4. private AsyncQueryHandler asyncQuery;
  5. private ListView personList;
  6. private BaseAdapter adapter;
  7. @Override
  8. public void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.main);
  11. personList = (ListView) findViewById(R.id.list_view);
  12. asyncQuery = new MyAsyncQueryHandler(getContentResolver());
  13. //异步读取联系人的信息
  14. asyncQueryContact();
  15. }
  16. private void asyncQueryContact() {
  17. // TODO Auto-generated method stub
  18. Uri uri = Uri.parse("content://com.android.contacts/data/phones");
  19. String[] projection = { "_id", "display_name", "data1", "sort_key" };
  20. asyncQuery.startQuery(0, null, uri, projection, null, null,"sort_key COLLATE LOCALIZED asc");
  21. }
  22. private class MyAsyncQueryHandler extends AsyncQueryHandler {
  23. public MyAsyncQueryHandler(ContentResolver cr) {
  24. super(cr);
  25. }
  26. @Override
  27. protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
  28. if (cursor != null && cursor.getCount() > 0) {
  29. listData = new ArrayList<ContentValues>();
  30. //cursor.moveToFirst();
  31. for (int i = 0; i < cursor.getCount(); i++) {
  32. ContentValues cv = new ContentValues();
  33. cursor.moveToPosition(i);
  34. String name = cursor.getString(1);
  35. String number = cursor.getString(2);
  36. String sortKey = cursor.getString(3);
  37. if (number.startsWith("+86")) {
  38. cv.put(NAME, name);
  39. //process (+86)
  40. cv.put(NUMBER, number.substring(3));
  41. cv.put(SORT_KEY, sortKey);
  42. } else {
  43. cv.put(NAME, name);
  44. cv.put(NUMBER, number);
  45. cv.put(SORT_KEY, sortKey);
  46. }
  47. listData.add(cv);
  48. }
  49. if (listData.size() > 0) {
  50. setAdapter(listData);
  51. }
  52. cursor.close();
  53. }
  54. }
  55. }
  56. private void setAdapter(List<ContentValues> listData) {
  57. adapter = new ListAdapter(this, listData);
  58. personList.setAdapter(adapter);
  59. }
  60. private class ListAdapter extends BaseAdapter {
  61. private LayoutInflater inflater;
  62. private List<ContentValues> list;
  63. public ListAdapter(Context context, List<ContentValues> list) {
  64. this.inflater = LayoutInflater.from(context);
  65. this.list = list;
  66. }
  67. @Override
  68. public int getCount() {
  69. return list.size();
  70. }
  71. @Override
  72. public Object getItem(int position) {
  73. return list.get(position);
  74. }
  75. @Override
  76. public long getItemId(int position) {
  77. return position;
  78. }
  79. @Override
  80. public View getView(int position, View convertView, ViewGroup parent) {
  81. ViewHolder holder;
  82. if (convertView == null) {
  83. convertView = inflater.inflate(R.layout.list_item, null);
  84. holder = new ViewHolder();
  85. holder.name = (TextView) convertView.findViewById(R.id.name);
  86. holder.number = (TextView) convertView.findViewById(R.id.number);
  87. convertView.setTag(holder);
  88. } else {
  89. holder = (ViewHolder) convertView.getTag();
  90. }
  91. ContentValues cv = list.get(position);
  92. holder.name.setText(cv.getAsString(NAME));
  93. holder.number.setText(cv.getAsString(NUMBER));
  94. return convertView;
  95. }
  96. private class ViewHolder {
  97. TextView name;
  98. TextView number;
  99. }
  100. }
  101. }

这个例子,只是使用了AsyncQueryHandler类中的异步查询方法,其它的方法,也是类似,大家可以自己尝试。

源代码下载地址:

http://download.csdn.net/detail/hfreeman2011/5040647

参考资料:

1.android异步的几种方式

http://ericchan2012.iteye.com/blog/1673929

2.官方文档

http://developer.android.com/reference/android/content/AsyncQueryHandler.html

3.android快速滑动列表 首字母提示

http://download.csdn.net/detail/j1582830/4010012

Android 异步开发之 AsyncQueryHandler

 
批量添加联系人
 <!-- 添加联系人权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<!-- 加入SDCARD的删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 加入SDCARD的写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<!-- 联系人相关的uri -->
content://com.android.contacts/contacts 操作的数据是联系人信息Uri
content://com.android.contacts/data/phones 联系人电话Uri
content://com.android.contacts/data/emails 联系人Email Uri

public class MainActivity extends Activity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
Toast.makeText(getApplicationContext(), "没有sdcard",0).show();
return;
} final String path = Environment.getExternalStorageDirectory()
.toString() + "/addcont/";
((TextView)findViewById(R.id.tv)).setText("文件存放的目录:"+path); findViewById(R.id.btn).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
File dirFire = new File(path);
if (!dirFire.exists()) {
dirFire.mkdirs();
return;
}
File[] files = dirFire.listFiles(new FileFilter() {
public boolean accept(File arg0) {
if (arg0.getName().endsWith(".txt")) {// 选择txt文件
return true;
}
return false;
}
});
if (files != null && files.length > 0) {
for (File file : files) {
try {
FileInputStream is = null; // 输入流读取文件
BufferedReader dr = null; // 读行
is = new FileInputStream(file);
dr = new BufferedReader(new InputStreamReader(is));
String totalTrans = null;
List<Tb_contacts> contacts = new ArrayList<Tb_contacts>();
while ((totalTrans = dr.readLine()) != null) {
if (totalTrans.contains("|")) {
String[] conStrings = totalTrans.trim().split("|");
contacts.add(new Tb_contacts(conStrings[1], conStrings[0]));
} else {
contacts.add(new Tb_contacts("", totalTrans.trim()));
}
}
BatchAddContact(contacts);
dr.close();
is.close();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), "导入联系人失败",0).show();
}
}
} } else { } }
});
} public void BatchAddContact(List<Tb_contacts> list) {
try {
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(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 = getContentResolver()
.applyBatch(ContactsContract.AUTHORITY, ops);
Log.i("tag", "----------------------------------" + results);
for (ContentProviderResult result : results) { }
}
} catch (RemoteException e) {
e.printStackTrace();
} catch (OperationApplicationException e) {
e.printStackTrace();
}
} private class Tb_contacts {
private String name;
private String number; 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;
}
} }
[mw_shl_code=java,true]/**
* 添加联系人
*/
private void insertNewContact(ContactItemList contactItemList) {
for (int rawContactInsertIndex = 0; rawContactInsertIndex < contactItemList.size(); rawContactInsertIndex++) { ContactItem contactItem = contactItemList.get(rawContactInsertIndex);
String name = contactItem.getName();
String nickname = contactItem.getNickName();
String company = contactItem.getUnit();
String post = contactItem.getBusiness();
String mobilephone = contactItem.getCellPhone();
String hometel = contactItem.getHomeTel();
String officetel = contactItem.getOfficeTel();
String fax = contactItem.getFax();
String email = contactItem.getEmail();
String qq = contactItem.getQq();
String msn = contactItem.getMsn();
Date birthday = contactItem.getBirthday();
String remark = contactItem.getRemark(); ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); // 在名片表插入一个新名片
ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI).withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null).withValue(ContactsContract.RawContacts._ID, 0).withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null).withValue(ContactsContract.RawContacts.AGGREGATION_MODE, ContactsContract.RawContacts.AGGREGATION_MODE_DISABLED).build()); // 姓名
if (StringUtils.isNotEmpty(name)) {
// System.out.println("name: " + name);
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name).build());
} // 昵称
if (StringUtils.isNotEmpty(nickname)) {
// System.out.println("nickname: " + nickname);
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, Nickname.CONTENT_ITEM_TYPE).withValue(Nickname.NAME, nickname).withValue(Nickname.TYPE, Nickname.TYPE_CUSTOM).build());
} // 公司
if (StringUtils.isNotEmpty(company)) {
// System.out.println("company: " + company);
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, company).withValue(ContactsContract.CommonDataKinds.Organization.TYPE, ContactsContract.CommonDataKinds.Organization.TYPE_WORK).build());
} // 职位
if (StringUtils.isNotEmpty(post)) {
// System.out.println("post: " + post);
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.Organization.TITLE, post).withValue(ContactsContract.CommonDataKinds.Organization.TYPE, ContactsContract.CommonDataKinds.Organization.TYPE_WORK).build());
} // 手机
if (StringUtils.isNotEmpty(mobilephone)) {
// System.out.println("mobilephone: " + mobilephone);
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, mobilephone).withValue(ContactsContract.CommonDataKinds.Phone.TYPE, Phone.TYPE_MOBILE).build());
} // 家庭电话
if (StringUtils.isNotEmpty(hometel)) {
// System.out.println("hometel: " + hometel);
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, hometel).withValue(ContactsContract.CommonDataKinds.Phone.TYPE, Phone.TYPE_HOME).build());
} // 办公电话
if (StringUtils.isNotEmpty(officetel)) {
// System.out.println("officetel: " + officetel);
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, officetel).withValue(ContactsContract.CommonDataKinds.Phone.TYPE, Phone.TYPE_WORK).build());
} // 传真
if (StringUtils.isNotEmpty(fax)) {
// System.out.println("fax: " + fax);
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, fax).withValue(ContactsContract.CommonDataKinds.Phone.TYPE, Phone.TYPE_FAX_WORK).build());
} // 邮箱
if (StringUtils.isNotEmpty(email)) {
// System.out.println("email: " + email);
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.Email.DATA, email).withValue(ContactsContract.CommonDataKinds.Email.TYPE, Email.TYPE_WORK).build());
} // QQ
if (StringUtils.isNotEmpty(qq)) {
// System.out.println("qq: " + qq);
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.Im.DATA1, qq).withValue(ContactsContract.CommonDataKinds.Im.PROTOCOL, ContactsContract.CommonDataKinds.Im.PROTOCOL_QQ).build());
} // MSN
if (StringUtils.isNotEmpty(msn)) {
// System.out.println("msn: " + msn);
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.Im.DATA1, msn).withValue(ContactsContract.CommonDataKinds.Im.PROTOCOL, ContactsContract.CommonDataKinds.Im.PROTOCOL_MSN).build());
} // 备注
if (StringUtils.isNotEmpty(remark)) {
// System.out.println("remark: " + remark);
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.Note.NOTE, remark).build());
} try {
ContentProviderResult[] result = context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
for (ContentProviderResult cpr : result) {
System.out.println(cpr.uri.toString());
}
} catch (OperationApplicationException e) {
Log.e(TAG, e.getMessage(), e);
} catch (RemoteException e) {
Log.e(TAG, e.getMessage(), e);
}
} }[/mw_shl_code]
 
http://www.eoeandroid.com/forum.php?mod=viewthread&tid=327658
//自己解决了~ 把这一句里的
// 在名片表插入一个新名片 ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI).withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null).withValue(ContactsContract.RawContacts._ID, 0).withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null).withValue(ContactsContract.RawContacts.AGGREGATION_MODE, ContactsContract.RawContacts.AGGREGATION_MODE_DISABLED).build()); withValue(ContactsContract.RawContacts._ID, 0).去掉就可以了~
package com.ljq.contact;

import java.util.ArrayList;

import android.content.ContentProviderOperation;
import android.content.ContentProviderResult;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContacts;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.test.AndroidTestCase;
import android.util.Log; public class ContactTest extends AndroidTestCase{
private static final String TAG = "ContactTest"; /**
* 获取通讯录中联系人
*/
public void testGetContact(){
ContentResolver contentResolver = this.getContext().getContentResolver();
Uri uri = Uri.parse("content://com.android.contacts/contacts");
Cursor cursor = contentResolver.query(uri, null, null, null, null);
while(cursor.moveToNext()){
// 获取联系人姓名
StringBuilder sb = new StringBuilder();
String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
sb.append("contactId=").append(contactId).append(",name=").append(name); //获取联系人手机号码
Cursor phones = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId,
null, null);
while(phones.moveToNext()){
String phone = phones.getString(phones.getColumnIndex("data1"));
sb.append(",phone=").append(phone);
} //获取联系人email
Cursor emails = contentResolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId,
null, null);
while(emails.moveToNext()){
String email = emails.getString(emails.getColumnIndex("data1"));
sb.append(",email=").append(email);
}
Log.i(TAG, sb.toString());
}
} /**
* 首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId
*
* 这是后面插入data表的数据,只有执行空值插入,才能使插入的联系人在通讯录里可见
*/
public void testInsert(){
ContentValues values = new ContentValues();
//首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId
Uri rawContactUri = this.getContext().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, "zhangsan");
this.getContext().getContentResolver().insert(
android.provider.ContactsContract.Data.CONTENT_URI, values); //往data表入电话数据
values.clear();
values.put(android.provider.ContactsContract.Contacts.Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
values.put(Phone.NUMBER, "5554");
values.put(Phone.TYPE, Phone.TYPE_MOBILE);
this.getContext().getContentResolver().insert(
android.provider.ContactsContract.Data.CONTENT_URI, values); //往data表入Email数据
values.clear();
values.put(android.provider.ContactsContract.Contacts.Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
values.put(Email.DATA, "ljq218@126.com");
values.put(Email.TYPE, Email.TYPE_WORK);
this.getContext().getContentResolver().insert(
android.provider.ContactsContract.Data.CONTENT_URI, values);
} /**
* 批量添加联系人,处于同一个事务中
*/
public void testSave() throws Throwable{
//文档位置:reference\android\provider\ContactsContract.RawContacts.html
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
int rawContactInsertIndex = 0;
ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
.withValue(RawContacts.ACCOUNT_TYPE, null)
.withValue(RawContacts.ACCOUNT_NAME, null)
.build()); //文档位置:reference\android\provider\ContactsContract.Data.html
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.GIVEN_NAME, "lisi")
.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, "5556")
.withValue(Phone.TYPE, Phone.TYPE_MOBILE)
.withValue(Phone.LABEL, "")
.build());
ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE)
.withValue(Email.DATA, "lisi@126.cn")
.withValue(Email.TYPE, Email.TYPE_WORK)
.build()); ContentProviderResult[] results = this.getContext()
.getContentResolver().applyBatch(ContactsContract.AUTHORITY,ops);
for (ContentProviderResult result : results) {
Log.i(TAG, result.uri.toString());
}
} }
 
 
 

Android 异步开发之 AsyncQueryHandler 批量添加联系人的更多相关文章

  1. Android混合开发之WebViewJavascriptBridge实现JS与java安全交互

    前言: 为了加快开发效率,目前公司一些功能使用H5开发,这里难免会用到Js与Java函数互相调用的问题,这个Android是提供了原生支持的,不过存在安全隐患,今天我们来学习一种安全方式来满足Js与j ...

  2. Android混合开发之WebView与Javascript交互

    前言: 最近公司的App为了加快开发效率选择了一部分功能采用H5开发,从目前市面的大部分App来讲,大致分成Native App.Web App.Hybrid App三种方式,个人觉得目前以Hybri ...

  3. Android混合开发之WebView使用总结

    前言: 今天修改项目中一个有关WebView使用的bug,激起了我总结WebView的动机,今天抽空做个总结. 混合开发相关博客: Android混合开发之WebView使用总结 Android混合开 ...

  4. Android安全开发之WebView中的地雷

    Android安全开发之WebView中的地雷 0X01 About WebView 在Android开发中,经常会使用WebView来实现WEB页面的展示,在Activiry中启动自己的浏览器,或者 ...

  5. android软件开发之webView.addJavascriptInterface循环渐进【二】

    本篇文章由:http://www.sollyu.com/android-software-development-webview-addjavascriptinterface-cycle-of-gra ...

  6. Android NDK开发之C调用Java及原生代码断点调试(二)

    上一篇中,我们主要学习了Java调用本地方法,并列举了两大特殊实例来例证我们的论据,还没学习的伙伴必须先去阅读下,本次的学习是直接在上一篇的基础上进行了.点击:Android NDK开发之从Java与 ...

  7. Android安全开发之ZIP文件目录遍历

    1.ZIP文件目录遍历简介 因为ZIP压缩包文件中允许存在“../”的字符串,攻击者可以利用多个“../”在解压时改变ZIP包中某个文件的存放位置,覆盖掉应用原有的文件.如果被覆盖掉的文件是动态链接s ...

  8. Android驱动开发之Hello实例

    Android驱动开发之Hello实例:   驱动部分 modified:   kernel/arch/arm/configs/msm8909-1gb_w100_hd720p-perf_defconf ...

  9. android软件开发之webView.addJavascriptInterface循环渐进【一】

    本篇文章由:http://www.sollyu.com/android-software-development-webview-addjavascriptinterface-cycle-of-gra ...

随机推荐

  1. sql:SQL Server metadata queries

    http://www.mssqltips.com/sqlservertip/3449/making-sql-server-metadata-queries-easier-with-these-new- ...

  2. TAT

    瞎扯 继\(HNOI,\)学科\(,CTSC, APIO\)连续爆炸之后 曾一度的怀疑人生,没有任何搞学习的欲望 不断的反省自己:我为什么这么菜? 然后回去搞学科,一直处于一个颓废的状态 后来得知\( ...

  3. Linux菜鸟简单命令

    想要使用Linux,以下这些命令不可少的哦! 我在工作中经常用到的大多数都是一些文件的查找,和上传下载什么的,没什么技术含量,所以除了自己整理的之外,还有借鉴的别的大神的一些命令,我会在最后标注的\( ...

  4. Ubuntu增加一个用户并给普通用户赋予root权限的方法

    1.添加用户,首先用adduser命令添加一个普通用户,命令如下: #adduser tommy //添加一个名为tommy的用户#passwd tommy   //修改密码Changing pass ...

  5. 浏览器根对象window之performance

    W3C性能小组引入的新的API,目前IE9以上的浏览器都支持. 为了解决当前性能测试的困难,W3C推出了一套性能API标准,各种浏览器对这套标准的支持如今也逐渐成熟起来.这套API的目的是简化开发者对 ...

  6. AutoCAD LoadLibrary Failed with error 126 Message

    LoadLibrary Failed with error 126 Message BY C3DISH ON 26 MAY, 2013 · ADD COMMENT I wanted to post a ...

  7. MUI框架-01-介绍-创建项目-简单页面

    MUI框架-01-介绍-准备-创建项目 从0开始快速高效学习 MUI 框架 官方文档:http://dev.dcloud.net.cn/mui/ui/ (1)MUI 介绍 MUI 是什么,解决了什么问 ...

  8. java多线程处理问题

    今天碰到个以前的线上bug需要处理下:问题是这样的,我们的app里面有个点赞的功能,点赞完后显示点赞人列表以及点赞数量,但是数量现在总是不准确.之后查看代码,发现点赞时候只是简单的向数据库添加了一条点 ...

  9. String类型的学习

    一 :关于两个string类型变量是否相等: 请运行以下示例代码StringPool.java,查看其输出结果.如何解释这样的输出结果?从中你能总结出什么? 分析: 首先为s0开辟空间,然后给s1开辟 ...

  10. 在notepad++中快速插入当前时间方法

    插件是notepad++的一大优势,而要实现此功能,也必须借助TextFX插件. 1.点击"插件"-->"Plugin Manager"-->&qu ...