最近学习了Android四大组件之一的ContentProvider,Android系统通过ContentProvider为应用程序之间共享数据提供了统一的接口。
Android已经为常见的一些数据提供了默认的ContentProvider。手机里面的联系人信息是以sqlite数据表的形式存储在系统的数据库中的,所以我们若要取到系统的联系人,就得依托于这个类。我们通过一个uri就可以获得这个数据库的一些操作方法,从而对联系人进行增删改查。
有的系统提供的uri,当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver 类来完成,要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法,来操作数据。
public static List<Contact> getAllContact(Context context) {
List<Contact>list=new ArrayList<Contact>();
//利用系统的ContactProvider来查询联系人信息
//数据来自contacts,data表
ContentResolver cr = context.getContentResolver();
String[]projection =new String[]{ContactsContract.Contacts._ID,ContactsContract.Contacts.PHOTO_ID};
Cursor cursor=cr.query(ContactsContract.Contacts.CONTENT_URI, projection,
null, null, null);
//遍历从contacts数据表中的数据集
while(cursor.moveToNext()){
Contact contact=new Contact();
contact.set_id(cursor.getInt(0));
contact.setPhoto_id(cursor.getInt(1));
//利用联系人的_id,到Data表中继续查询
ContentResolver cr2=context.getContentResolver();
Cursor cursor2=cr2.query(ContactsContract.Data.CONTENT_URI,
new String[]{Data.MIMETYPE,Data.DATA1},
Data.RAW_CONTACT_ID+"=?", new String[]{String.valueOf(contact.get_id())},
null);
//从data表中取回的,特定id联系人的具体数据
while(cursor2.moveToNext()){
String mimeTypeString=cursor2.getString(0);
if (mimeTypeString.equals("vnd.android.cursor.item/email_v2")) {
contact.setEmail(cursor2.getString(1));
}
if (mimeTypeString.equals("vnd.android.cursor.item/name")) {
contact.setName(cursor2.getString(1));
}
if (mimeTypeString.equals("vnd.android.cursor.item/phone_v2")) {
contact.setPhone(cursor2.getString(1));
}
if (mimeTypeString.equals("vnd.android.cursor.item/postal-address_v2")) {
contact.setAddress(cursor2.getString(1));
}
if (mimeTypeString.equals("vnd.android.cursor.item/photo")) {
//contact.setPhoto_id(cursor2.getInt(1));
//int photo=contact.get_id();
//long i=photo;
/*InputStream input=ContactsContract.Contacts.openContactPhotoInputStream(cr2,
ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,
(long)contact.get_id()
//Long.parseLong(String.valueOf(contact.getPhoto_id()))
//photo
));
contact.setPhotoBitmap(BitmapFactory.decodeStream(input));*/
}
}
cursor2.close();
if (TextUtils.isEmpty(contact.getName())) {
contact.setName(contact.getPhone());
}
list.add(contact);
}
cursor.close();
return list;
}