如何理解ContentProvider?(通讯录)

如何理解ContentProvider?(通讯录)_第1张图片
提供手机内部数据的程序 contentprovider 通过 uri 实现对数据的增删改查
如何理解ContentProvider?(通讯录)_第2张图片
Uri 是指通用资源标志符
Content: //包名/music/#

  1. Content: 前缀 表示数据受控于哪一个内容提供者,他从不修改也就是schema
  2. 包名 是指在AndroidMainfest.xml中我们注册的provider中的android:authorities属性所对应的
  3. Music 表示具体操作那个条目
  4. # 具体指定到那个条目下的那条记录(#表示通配符)

客户端通过 uri 访问到我们的 contentprovider
如何理解ContentProvider?(通讯录)_第3张图片
如何理解ContentProvider?(通讯录)_第4张图片
如何理解ContentProvider?(通讯录)_第5张图片
如何理解ContentProvider?(通讯录)_第6张图片
使用系统的contentprovider
MainActivity.java 获得联系人的名字电话和id


public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ContentResolver cr = getContentResolver();
        // 查询返回一个游标对象
        Cursor c = cr.query(Contacts.CONTENT_URI, new String[] { Contacts._ID,
                Contacts.DISPLAY_NAME }, null, null, null);
        if (c != null) {
            while (c.moveToNext()) {
                //查询联系人id和姓名
                int id=c.getInt(c.getColumnIndex("_id"));
                Log.i("info","_di:"+id);
                Log.i("info","name:"+c.getString(c.getColumnIndex("display_name")));
                //Phone是ContactsContract;的一个内部类
                //根据id 查询出联系人的电话号码
                Cursor c1=cr.query(Phone.CONTENT_URI, new String[] {Phone.NUMBER,Phone.TYPE}, Phone.CONTACT_ID+"="+id, null, null);                     
                if(c1!=null){
                    while (c1.moveToNext()) {
                    int type=c1.getInt(c1.getColumnIndex(Phone.TYPE));
                        if(type==Phone.TYPE_HOME)
                        {
                            Log.i("info","TYPE_HOME:"+c1.getString(c1.getColumnIndex(Phone.NUMBER)));
                        }else if(type==Phone.TYPE_MOBILE){
                            Log.i("info","TYPE_MOBILE:"+c1.getString(c1.getColumnIndex(Phone.NUMBER)));
                        }
                    }
                    c1.close();
                }
            Cursor c2=cr.query(Email.CONTENT_URI, new String[]{Email.DATA,Email.TYPE}, Email._ID+"="+id, null, null);
            if(c2!=null)
            {
                while (c2.moveToNext()) {
                    int type=c2.getInt(c2.getColumnIndex("Data.Type"));
                    if(type==Email.TYPE_WORK)
                    {
                        Log.i("info","工作邮箱TYPE_WORK:"+c2.getString(c2.getColumnIndex(Email.DATA)));                 
                    }
                }
                c2.close();
             }
            }
            c.close();      
        }
    }
}
//记得加权限
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
      <uses-permission android:name="android.permission.READ_CONTACTS" />

你可能感兴趣的:(android)