Android四大组件之ContentProvider

Android四大组件之ContentProvider_第1张图片



ContentProvider适用场景:

1) ContentProvider为存储和读取数据提供了统一的接口。
2) 使用ContentProvider,应用程序可以实现数据共享。
3) android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等)。


如何实现ContentProvider?

1.继承抽象类ContentProvider实现一系列针对于数据的增、删、改、查等方法;

2.需要在AndroidMainfest.xml中完成对ContentProvider的注册。


何为Uri?

Uri是指通用资源标识符

      content://com.example.provider/music/#

第一段:前缀表明数据受控于一个内容提供者。它从不修改,也就是schema

第二段:是指在AndroidMainfest.xml中我们注册的Provider中的android:authorities属性所对应的

第三段:具体操作于哪个条目

第四段:具体指定到哪个条目下的哪条记录(#表示通配符)


ContentResolver:

  使用ContentResolver操作ContentProvider中的数据:

1.当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成

2.使用Activity提供的getContentResolver()方法获取ContentResolver对象

3.ContentResolver类提供了与ContentProvider类相同签名的四个方法


Android四大组件之ContentProvider_第2张图片

看下列代码展示:

            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())
	    	{
	    	    int id=c.getInt(c.getColumnIndex("_id"));
	    	    Log.i("info", "_id:"+id);
	    	    Log.i("info", "name:"+c.getString(c.getColumnIndex("display_name")));
	    	    Cursor c1=cr.query(Phone.CONTENT_URI, new String[]{Phone.NUMBER,Phone.TYPE}, Phone.CONTACT_ID+"="+id, null, null);
	    	    //根据联系人ID查询出联系人的电话号码
	    	    if(c1!=null)
	    	    {
	    	    	while(c1.moveToNext())
	    	    	{
	    	    		int type=c1.getInt(c1.getColumnIndex(Phone.TYPE));
	    	    		if(type==Phone.TYPE_HOME)
	    	    		{
	    	    			Log.i("info", "家庭电话:"+c1.getString(c1.getColumnIndex(Phone.NUMBER)));
	    	    		}
	    	    		else {
	    	    			Log.i("info", "手机:"+c1.getString(c1.getColumnIndex(Phone.NUMBER)));
						}
	    	    	}
	    	        c1.close();
	    	    } 
	    	     //根据联系人的ID去查询出联系人的邮箱
	    	     Cursor c2=cr.query(Email.CONTENT_URI, new String[]{Email.DATA,Email.TYPE}, Email.CONTACT_ID+"="+id, null, null);
	    	     if (c2!=null) {
					while (c2.moveToNext()) {
					    int type=c2.getInt(c2.getColumnIndex(Email.TYPE));
					    if (type==Email.TYPE_WORK) {
							Log.i("info", "工作邮箱:"+c2.getString(c2.getColumnIndex(Email.DATA)));
						}
					}
					c2.close();
				}
	    	}
	    	c.close();
	    } 


需要注意的地方都用红色标记出来了。

还有一个注意的地方就是设置访问权限




自己先在通讯录里创建两个联系人:如Jim和张三

Android四大组件之ContentProvider_第3张图片


Android四大组件之ContentProvider_第4张图片


运行结果如下:

Android四大组件之ContentProvider_第5张图片


你可能感兴趣的:(android)