其实联系人那几个表刚开始看起来很绕的!
后来接触多了,慢慢的感觉好了点。
经常总结下,也方便以后回头查找!
这三个表:Raw_contacts, Data ,Contacts
Raw_contacts:这个表放的是联系人的唯一标识,ID啦!其他的两个表里面有个rawContactID是对应的外键。
Data :这个放的是联系人的具体的信息,像号码啦,邮箱啦,地址啦 之类的
Contacts:这个放的就是一条条的联系人,主要存的是display_name啊,有没号码啦。
其他还有一些子类也经常遇到像CommonDataKinds这样的!
刚开始插入一个联系人的时候查了好多资料,最后才发现姓名跟号码是要分开来插入的,因为类型不同!
其实这些例子在API里面都有的!
查询通讯录中的信息:
ContentResolver contentResolver = this.getContext().getContentResolver();
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
Cursor nameCursor = contentResolver.query(Contacts.CONTENT_URI, null, null, null, sortOrder);
if(null != nameCursor && nameCursor .moveToFirst() ){
do{
String id = nameCursor .getInt(
nameCursor .getColumnIndex(ContactsContract.Contacts._ID));
//获取联系人姓名
String name =nameCursor .getString(
nameCursor .getColumnIndex(PhoneLookup.DISPLAY_NAME));
}while(nameCursor .moveToNext());
nameCursor .close();
}
//获取联系人号码查询
Cursor numCursor = ctx.getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, null, null, null);
if(numCursor!=null&&numCursor.getCount()!=0){
do{
String nummber = numCursor.getString(numCursor.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.NUMBER));
}while(numCursor.moveToNext());
numCursor.close();
}
//记得每次都要去关掉游标,上次就是因为没关游标导致的错误。忘记报的什么错误了!好像就是下标最多2000那样
插入一个新的联系人记录:
代码懒得自己写了,引用wenlin56的帖子中 现成的代码,以下是原帖链接:
http://blog.csdn.net/wenlin56/archive/2010/12/14/6074437.aspx
有个要注意的地方就是插入详细信息到DATA里面 必须要先得到那个rawContactId,所以之前要插一个空值来获得这个!
ContentValues values = new ContentValues();
Uri rawContactUri = ctx.getContentResolver().insert(
RawContacts.CONTENT_URI, values);
// 然后获取系统返回的rawContactId , 就是新加入的这个联系人的 ID
long rawContactId = ContentUris.parseId(rawContactUri);
// Andorid 中,将联系人的姓名、电话 分别存放在 data 表的同一个字段的两条记录当中 类型不同 因此要 Insert 两次
// 往data表入姓名数据
values.clear();
// raw_contacts_id 字段,是 raw_contacts表id 的外键,用于说明此记录属于哪一个联系人
values.put(Data.RAW_CONTACT_ID, rawContactId);
// mimitype_id 字段,用于描述此数据的类型,电话号码?Email?....
values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
values.put(StructuredName.GIVEN_NAME, “唐自刚”);
ctx.getContentResolver().insert(
android.provider.ContactsContract.Data.CONTENT_URI, values);
// 往data表入电话数据
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
values.put(Phone.NUMBER, “18610230851”);
values.put(Phone.TYPE, Phone.TYPE_MOBILE);
ctx.getContentResolver().insert(
android.provider.ContactsContract.Data.CONTENT_URI, values);
顺便补充下查询SIM卡联系人
Uri uri = Uri.parse("content://icc/adn");
ContentResolver cr = ctx.getContentResolver();
Cursor cursor = cr.query(uri, null, null, null, null);
//不遍历游标了,你看得懂的!
name = cursor.getString(cursor.getColumnIndex(People.NAME));
number = cursor.getString(cursor.getColumnIndex(People.NUMBER));
这篇就写到这里了! 想要继续看批量添加联系人的话 moveToNext();