第一次 在csdn发表博客,主要用于大家一起学习,共勉
今天学习了如何从手机数据库中查找联系人数据,电话,图片什么的都可以用此方法类推,本人技术有限,如果有什么不足的地方,希望大家提出意见。谢谢
开始
android系统中联系人数据在DATA/DATA/com.android.providers.contacts/databases/contact2.db中
我们可以使用SQLite Expert Personal 把到出的contact2.db文件进行解析读取出来
这个数据库文件中包含很多的表和视图文件
我们找到contacts、data、mimetypes 这三张表
我点开第一张表contacts
里面包含了id 、phontoId、raw_contact_id
id表示一个联系人、这个联系图片ID phonoId则表示图片Id(就像把每个人照片放放在通信录里)
raw_contact_id则在关联表中体现出来,应为因为所有的文字信息都是存在data中data1里面 data15存的是16进制一串数字
mimetypes存的是data1中每个数据的类型,而在data中这些是用数字表示
所以我们获取联系人逻辑应该是在,Contacts这张表中遍历第一行和第二行,我们就可以得到所有的联系人id、和photoId
在android中访问其他软件数据库,或者官方data数据库时,我们需要借助android四大组件中的contentProvider(内容提供者)
再借助ContentResolver类获取数据
具体代码
List<Contact> cs=new ArrayList<Contact>();
ContentResolver contentResolver=Context.getContentResolver();
再通过JAVA封装好的查询方法查询
Uri uri=Contacts.CONTENT_URI;
String [] columns =new String[]{
Contacts._ID, // API已经全部封装好了
Contacts.PHOTO_ID
};
Cursor cursor=r.query(uri, columns, null, null, null); // 查询所有数据
while(cursor.moveToNext()){
Contact c=new Contact();
int id=cursor.getInt(0);
int photoId=cursor.getInt(1);
c.setId(id);
c.setPhotoId(photoId);
//通过id 去data表中查询当前联系人的其他信息
//uri2: content://com.android.contacts/data
Uri uri2=Data.CONTENT_URI;
String[] columns2={
Data.DATA1, //0
Data.DATA15, //1
Data.MIMETYPE //2
};
Cursor c2=r.query(uri2, columns2, Data.RAW_CONTACT_ID+"="+id, null, null);
while(c2.moveToNext()){
String data1=c2.getString(0);
String mt=c2.getString(2);
if(mt.equals(Email.CONTENT_ITEM_TYPE)){
//当前数据描述的是联系人的email
c.setEmail(data1);
}else if(mt.equals(Phone.CONTENT_ITEM_TYPE)){
//当前数据描述的是联系人的phone
c.setPhone(data1);
}else if(mt.equals("vnd.android.cursor.item/postal-address_v2")){
//当前数据描述的是联系人的address
c.setAddress(data1);
}else if(mt.equals("vnd.android.cursor.item/name")){
//当前数据描述的是联系人的name
c.setName(data1);
}
}
cs.add(c);
c2.colse();
}
c.colse();
}
我们得到的集合就是所有的联系人数据,具体我们需要创建个联系人实体类,以后可以通过get方法获取数据