Notes:
一、AsyncQueryHandler是什么
①AsyncQueryHandler(异步的查询操作帮助类,其实它同样可以处理增删改)
继承于Handler
②异步就好像大家一起上公交车,可以不排队,同步就是大家排队上车,一次只能上一个。
Handler | createHandler(Looper looper) |
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
A helper class to help make handling asynchronous ContentResolver queries easier.
让ContentResolver查询更加容易的帮助类。
三、如何使用AsyncQueryHandler
①继承AsyncQueryHandler类
②提供onXXXComplete方法
③实例化一个AsyncQueryHandler对象
Public Constructors | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
AsyncQueryHandler( ContentResolver cr) |
queryHandler = new MySyncQueryHandler(getContentResolver());
④启动查询
queryHandler.startQuery(0, /标识、令牌(不需要)
null, //cookie用来保存数据(一般情况不用)
RawContacts.CONTENT_URI, //ContentProvider的访问的Uri
new String[]{RawContacts._ID}, //要返回的列
null, //查询条件
null, //查询条件的值
null); //排序
⑤在子线程(回调函数中)设置数据到适配器
四、具体案例
MainActivity.java
package com.ryan.lsn3_11;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.AsyncQueryHandler;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Data;
import com.ryan.lsn3_12_2.MainActivity.MySyncQueryHandler;
import com.ryan.pojo.Contact;
public class MainActivity extends Activity {
ContentResolver resolver;
List<Contact> list = new ArrayList<Contact>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
resolver = getContentResolver();
queryContacts();
}
public void queryContacts(){
//查询raw_contact联系人表
Cursor c = resolver.query(
Contacts.CONTENT_URI,
new String[]{Contacts._ID},
null,
null,
null);
while(c.moveToNext()){
Contact contact = new Contact();
//获得联系人的
String id = c.getString(c.getColumnIndex(Contacts._ID));
//根据联系人的id来查询Data表
Cursor c1 = resolver.query(
Data.CONTENT_URI,
new String[]{Data._ID,Data.DATA1,Data.MIMETYPE},
Data.RAW_CONTACT_ID +" = ?",
new String[]{id},
null);
contact.setId(Integer.parseInt(id));
while(c1.moveToNext()){
//获得data表的id
String data_id = c1.getString(c1.getColumnIndex(Data._ID));
//获得数据
String data1 = c1.getString(c1.getColumnIndex(Data.DATA1));
//获得类型
String mimeType = c1.getString(c1.getColumnIndex(Data.MIMETYPE));
System.out.println(data_id+"---"+data1+"---"+mimeType);
//根据类型来判断数据
if(mimeType.equals("vnd.android.cursor.item/phone_v2")){
//设置电话号码
contact.setPhoneNum(data1);
}
else if(mimeType.equals("vnd.android.cursor.item/name")){
//设置姓名
contact.setName(data1);
}
}
c1.close();
//添加联系人对象到集合当中
list.add(contact);
}
c.close();
for(Contact c1 : list){
System.out.println("联系人的id为:"+c1.getId());
System.out.println("联系人的电话为:"+c1.getPhoneNum());
System.out.println("联系人的姓名为:"+c1.getName());
}
}
}