版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010356768/article/details/84559858
联系人表结构
首先在模拟机中添加几个联系人
然后打开Device File Exploer
data-data-com.android.providers.contacts下的databases文件夹
把contacts2.db导出,查看contacts表、data表、mimetypes表
联系人的信息操作前,必须把数据库的这3个表仔细看一下
contacts表
data表
mimetypes表
栗子:查询联系人数据
AndroidManifest.xml增加权限
<uses-permission android:name="android.permission.READ_CONTACTS"/>
Contact类
public class Contact {
private int id;
private int photoId;
private String name;
private String email;
private String phone;
private String address;
// 增加各个属性的set和get方法
......
@Override
public String toString() {
return "Contact id:"+id+",\nPhoto id:"+photoId+",\nName:"+name+",\nEmail:"+email+",\nPhone:"+phone+",\nAddress:"+address;
}
}
MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn_search;
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_search = findViewById(R.id.btn_search);
listView = findViewById(R.id.listview);
btn_search.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_search:
List<Contact> list = loadContacts();
Log.d("CONTACT", list.toString());
ArrayAdapter<Contact> arrayAdapter = new ArrayAdapter<Contact>(this, android.R.layout.simple_list_item_1, list);
listView.setAdapter(arrayAdapter);
break;
}
}
/**
* 查询联系人
* 先查contacts表,获取所有人id
* 再查data表,通过id查询这个人的其他信息
*/
private List<Contact> loadContacts() {
ContentResolver r = getContentResolver();
Uri uri = ContactsContract.Contacts.CONTENT_URI;
String[] projection = {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.PHOTO_ID
};
String[] column = {
ContactsContract.Data._ID,//0
ContactsContract.Data.MIMETYPE,//1
ContactsContract.Data.DATA1//2
};
Cursor c = r.query(uri, projection, null, null, null);
//准备集合
List<Contact> contacts = new ArrayList<Contact>();
while (c.moveToNext()) {
Contact contact = new Contact();
int id = c.getInt(0);
int photo_id = c.getInt(1);
contact.setId(id);
contact.setPhotoId(photo_id);
//通过id查data表,获取这个人的其他信息
Uri dataUri = ContactsContract.Data.CONTENT_URI;
Cursor c1 = r.query(dataUri, column, ContactsContract.Data.RAW_CONTACT_ID + "=?", new String[]{id + ""}, null);
while (c1.moveToNext()) {
int dataId = c1.getInt(0);
String mm = c1.getString(1);
String data1 = c1.getString(2);
//data表里的字段是mimetype_id,而这里查询的是mimetype,返回的是字符串
//通过contentprovider查到的就是字符串,拿不到id
if (mm.equals(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)) {
//描述的是Email
contact.setEmail(data1);
} else if (mm.equals(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)) {
//描述的是Phone
contact.setPhone(data1);
} else if (mm.equals("vnd.android.cursor.item/name")) {
//描述的是Name
contact.setName(data1);
} else if (mm.equals("vnd.android.cursor.item/sip_address")) {
//描述的是Address
contact.setAddress(data1);
}
}
contacts.add(contact);
c1.close();
}
c.close();
return contacts;
}
}
运行结果