联系人的开发

Android手机的通讯录联系人全部都存在系统的数据库中,如果须要获得通讯里联系人的信息就须要访问系统的数据库,才能将信息拿出来

contacts.db后 发面里面有一堆表,我们主要涉及到4张表,contacts 表 ,data表 ,phone_look_up表 ,raw_contact表 。

1.contacts 表

_id :表的ID,主要用于其它表通过contacts 表中的ID可以查到相应的数据。
display_name: 联系人名称
photo_id:头像的ID,如果没有设置联系人头像,这个字段就为空
times_contacted:通话记录的次数
last_time_contacted: 最后的通话时间
lookup :是一个持久化的储存 因为用户可能会改名子 但是它改不了lookup

Android手机的通讯录联系人全部都存在系统的数据库中,如果须要获得通讯里联系人的信息就须要访问系统的数据库,才能将信息拿出来

contacts.db后 发面里面有一堆表,我们主要涉及到4张表,contacts 表 ,data表 ,phone_look_up表 ,raw_contact表 。

1.contacts 表

_id :表的ID,主要用于其它表通过contacts 表中的ID可以查到相应的数据。
display_name: 联系人名称
photo_id:头像的ID,如果没有设置联系人头像,这个字段就为空
times_contacted:通话记录的次数
last_time_contacted: 最后的通话时间
lookup :是一个持久化的储存 因为用户可能会改名子 但是它改不了lookup


3.phone_look_up表

data_id : 通过data_id可以找到 datat表中相对的数据。
raw_contact_id : 通过raw_contact_id 可以找到 raw_contact_表中相对的数据。
normalized_number: 这个字段就比较有意思了,它是将每个电话号码逆序排列。

4.raw_contact表

version :版本号,用于监听变化
deleted :删除标志, 0为默认 1 表示这行数据已经删除
display_name : 联系人名称
last_time_contacts : 最后联系的时间 。

 

 

写道
content://com.android.contacts是联系人的路径,
content://com.android.contacts/contacts(所以联系人,要操作contacts这张表)
content://com.android.contacts/contacts/id 表示操作contact表中某一条id的记录
content://com.android.contacts/contacts/id/data 表示操作contact表中某一条id的记录中的data数据(data也是一张表)
 
写道
如果遇到这个错误:
Attempted to access a cursor
after it has been closed.

Application did not close the cursor or database
object that was opened here 。

原因是:

You should not be getting that message if you close the Cursor in onStop() or onDestroy().
Please try that again. Or, call startManagingCursor() after you get the Cursor from your query,
and Android will close the Cursor on its own.

也就说,你用了 startManagingCursor(c)或者
managedQuery(uri, null, null, null, null);

这个2个方法里面在操作数据库的时候,当获取完数据了,会自动关闭游标,那么你在不知道的情况下你再次关闭游标,所以造成崩溃。

解决方案:
采用getContentResolver;
比如:
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(uri, new String[]{"_id"}, null, null, null);

 

 

Java代码 复制代码  收藏代码
  1. /**  
  2.      * 查询所有的联系人  
  3.      */  
  4.     private void testContact() {   
  5.         //com.android.contacts是联系人的路径,com.android.contacts/contacts(所以联系人)  
  6.         try {   
  7.             Uri uri = Uri.parse("content://com.android.contacts/contacts");//联系人uri   
  8.                
  9.             ContentResolver resolver = getContentResolver();   
  10.             Cursor cursor = resolver.query(uri, new String[]{"_id"}, nullnullnull);   
  11.                
  12.             while(cursor.moveToNext()){   
  13.                 //根据列索引   
  14.                 int contactId = cursor.getInt(cursor.getColumnIndex("_id"));   
  15.                 System.out.println("id === " + contactId);   
  16.                    
  17.                 getContactByContactID(contactId);   
  18.             }   
  19.         } catch (Exception e) {   
  20.             e.printStackTrace();   
  21.         }   
  22.            
  23.     }   
  24.   
  25.   
  26. /**  
  27.      * 根据contact的id获取联系人的信息  
  28.      * @param contactId  
  29.      */  
  30.     private void getContactByContactID(int contactId) {   
  31.         ContentResolver phoneResolver = getContentResolver();   
  32.         Uri phoneUri = Uri.parse("content://com.android.contacts/contacts/"+contactId+"/data");//根据联系人的id来获取联系人的信息   
  33.         Cursor phoneCursor = phoneResolver.query(phoneUri, nullnullnullnull);   
  34.            
  35.         while(phoneCursor.moveToNext()){   
  36.                
  37.                
  38.             //data中的表,data1字段代表:姓+名,邮件,电话   
  39.             String data = phoneCursor.getString(phoneCursor.getColumnIndex("data1"));   
  40. //                  System.out.println("data ====== " + data);  
  41.                
  42.             //data2字段表示:名,邮件,电话的类型   
  43. //                  String data2 = phoneCursor.getString(phoneCursor.getColumnIndex("data2"));  
  44. //                  System.out.println("data2====== " + data2);  
  45.                
  46.             String mimeId = phoneCursor.getString(phoneCursor.getColumnIndex("mimetype"));   
  47. //                  System.out.println("mimeId====== " + mimeId);  
  48.                
  49.             if(mimeId.equals("vnd.android.cursor.item/phone_v2")){//电话  
  50.                 System.out.println("data ===phone=== " + data);//电话有多个  
  51.                    
  52.             }else if(mimeId.equals("vnd.android.cursor.item/email_v2")){//邮件  
  53.                 System.out.println("data ===email=== " + data);   
  54.                    
  55.             }else if(mimeId.equals("vnd.android.cursor.item/name")){//名称  
  56.                 System.out.println("data ===name=== " + data);   
  57.             }   
  58.         }   
  59.     }   
  60.   
  61.       

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值