zoukankan      html  css  js  c++  java
  • Android初级教程之内容提供者获取联系人信息

    内容提供折详细理论知识请参考之前的博文:http://blog.csdn.net/qq_32059827/article/details/51646513

    这里新建了三个联系人信息,通过查看系统联系人源码知道,对三张表进行操作。


    联系人数据库

    • raw_contacts表:
      • contact_id:联系人id
    • data表:联系人的具体信息,一个信息占一行
      • data1:信息的具体内容
      • raw_contact_id:联系人id,描述信息属于哪个联系人
      • mimetype_id:描述信息是属于什么类型
    • mimetypes表:通过mimetype_id到该表查看具体类型

    读取联系人

    • 先查询raw_contacts表拿到联系人id

      Cursor cursor = cr.query(Uri.parse("content://com.android.contacts/raw_contacts"), new String[]{"contact_id"}, null, null, null);
      
    • 然后拿着联系人id去data表查询属于该联系人的信息

      Cursor c = cr.query(Uri.parse("content://com.android.contacts/data"), new String[]{"data1", "mimetype"}, "raw_contact_id = ?", new String[]{contactId}, null);
      
    • 得到data1字段的值,就是联系人的信息,通过mimetype判断是什么类型的信息

      while(c.moveToNext()){
          String data1 = c.getString(0);
          String mimetype = c.getString(1);
          if("vnd.android.cursor.item/email_v2".equals(mimetype)){
              contact.setEmail(data1);
          }
          else if("vnd.android.cursor.item/name".equals(mimetype)){
              contact.setName(data1);
          }
          else if("vnd.android.cursor.item/phone_v2".equals(mimetype)){
              contact.setPhone(data1);
          }
      }

    主要代码如下,对代码做出了详细的解释:

    package com.itheima.getcontacts;
    
    import com.itheima.getcontacts.domain.Contact;
    
    import android.net.Uri;
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.ContentResolver;
    import android.database.Cursor;
    import android.view.Menu;
    import android.view.View;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
    
        public void click(View v){
        	//通过内容提供者访问联系人数据库
        	ContentResolver cr = getContentResolver();//因为要查三张表,因此知道每张表都对应不同的路径,路径是什么去查看源码  。先查raw_contacts表      字段                         查询条件
        	Cursor cursorContactId = cr.query(Uri.parse("content://com.android.contacts/raw_contacts"), new String[]{"contact_id"}, null, null, null);
        	//里面封装着1、2、3
        	while(cursorContactId.moveToNext()){//封装着1、2、3
        		//,获取到raw_contacts表中的联系人id
        		String contactId = cursorContactId.getString(0);//分别依次得到1、2、3
        		//再查data表                                                                                                                                                      data表的路径                                            data表要三个字段,联系人id已经获得,因此这个表不用再查联系人id
        		Cursor cursorData =  cr.query(Uri.parse("content://com.android.contacts/data"), new String[]{"data1", "mimetype"}, //无mimetype_id只有mimetype。这样更方便,不用再去查第三张表了
        				"raw_contact_id = ?", new String[]{contactId}, null);//里面封装着data1、mimetype信息
        		//获取所有字段的名字
        		/*String[] names = cursorData.getColumnNames();
        		for (String string : names) {
    				System.out.println(string);
    			}*/
        		Contact con = new Contact();
        		while(cursorData.moveToNext()){//里面封装着data1、mimetype信息。例如联系人id=1时,while也要遍历三次
        			String data1 = cursorData.getString(0);//获取某个联系人id下的data1信息。一行信息又对应一个mimetype类型数据
        			String mimetype = cursorData.getString(1);//获取某个联系人id下的mimetype信息
        			//通过mimetype的判断,把data1存入对应的属性
        			if("vnd.android.cursor.item/email_v2".equals(mimetype)){//例如联系人id=1时
        				con.setEmail(data1);
        			}
        			else if("vnd.android.cursor.item/phone_v2".equals(mimetype)){
        				con.setPhone(data1);
        			}
        			else if("vnd.android.cursor.item/name".equals(mimetype)){
        				con.setName(data1);
        			}
        		}
        		System.out.println(con.toString());
        	}
        }
        
    }
    


  • 相关阅读:
    Angular1.0
    当今流行的 React.js 适用于怎样的 Web App?
    bower的权限问题
    淡定啊淡定
    JBoss for luna
    JQuery的二维码插件
    今天学人家玩云主机
    laravel5.2/laravel5.3入门指南 Windows 上快速安装并运行 Laravel 5.x
    验证mySqli扩展是否
    Amazon EC2 的名词解释
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299682.html
Copyright © 2011-2022 走看看