联系人的开发

来源:互联网 发布:淘宝外卖如何代付 编辑:程序博客网 时间:2024/06/07 18:24
转载:http://1002878825-qq-com.iteye.com/blog/1546326
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.       
	
				
		
原创粉丝点击