Notes:
一、导出数据库:
选中Devices后,在File Explorer下导出:data/data/com.android.providers.contacts/databases/contacts2.db
二、联系人的三张相关表
①raw_contacts表=======联系人表
其中的列:
☆(将用到)contact_id ========代表联系人id
account_name管理员的名字
version版本号
deleted 是否删除
display_name联系人姓名
……
②Data表 =========数据表
关联raw_contacts表
外键 raw_contact_id
③mimeType表(存放对应数据类型) 跟data表有关联关系,通过mimeType_id
三、读取联系人需要:
①uri
②表名
③当前应用的 ContentResolver实例
具体步骤:
一、创建实体类Contact.java
package com.ryan.pojo;
public class Contact {
private String phoneNum;
private String name;
private int id;
public String getPhoneNum() {
return phoneNum;
}
public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
二、MainActivity.java
package com.ryan.lsn3_11;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Data;
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());
}
}
}
三、在AndroidManifest.xml中添加权限
AndroidMainfest.xml/User Permission====》READ_CONTACTS读取联系人
Tips:
*通过查询是查视图
*游标里面没有_id会报错