【android基础篇】ContextProvider基本认识

ContentProvider即内容提供者。安卓的四大组件之一。I,ContextProvider的用途

对于市面上有很多软件有这么一些功能,比如:读取联系人,短信备份等。而系统的短信以及联系人都是以数据库文件形式存储着。但是这些文件对于其他访问者的权限是不可读不可写。那么那些短信备份,读取联系人这些功能又是怎么实现的呢?其实这里,靠的就是内容提供者。

可以把内容提供者想象成证监会和股民之间的中间人,这个中间人可能是证监会某个内部人员的亲戚朋友,它可以提供有效的信息给股民。但是如果证监会遵纪守法的话,也就是不提供接口,那么中间人也无法获取里面的信息。

 

II,去写一个内容提供者

1,写一个类去继承ContextProvider

ContentProvider是四大组件之一,需要在清单文件中进行配置,并且我们发现ContentProvider是抽象类,并且不继承Activity。

1 <provider android:name="内容提供者类的全名"  android:authorities="地址名"> 
2 </provider>

authorities当做是主机名,中间人可以通过该主机名找到证监会的内部人员。

对于主机名,可以随便写。但是一般都有规范,以“包名+内容提供者的用途”命名。

当写完以上的配置后,在清单文件中,还会出现警告。出现这种警告的原因是,你写下的主机名被完全暴露,也就是任何人都可以通过这个主机名来访问内容提供者。

如果不希望所有人都可以访问,可以设置一些权限permission。

 

2,复写的方法

继承抽象类ContentProvider后,复写了多个方法。如:query(),insert(),update(),delete(),还有OnCreate().

细心点不难发现,增删改查这四个方法都接收一个Uri类型的参数,这个参数表示的就是地址或主机名,准确的说它表示的是访问者提供的地址。

在类中我们需要一个Uri的匹配器,安卓为我们提供是UriMatcher类。

private static UriMatcher matcher=new UriMatcher(code);
	  

 这里的code表示的是,如果匹配不上返回的值。UriMatcher.NO_MATCH实际值就是-1.这里我们返回-1.

private static UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH); 

 在类被加载时,就为Uri匹配器制定一些规则,代码为:

 1   private static final int INSERT=1;
 2     private static final int DELETE=2;
 3     private static final int UPDATE=3;
 4     private static final int QUERY=4;
 5     
 6     static{
 7         /**
 8          * matcher.addURI(authority, path, code);
 9          * authority:匹配的主机名
10          * path:匹配的路径 (#代表数字  *表示任意路径)
11          * code:匹配后的返回值
12          */
13         /**
14          * 添加一组匹配规则
15          */
16         matcher.addURI("com.example.content.provider","insert",INSERT);
17         matcher.addURI("com.example.content.provider","insert",DELETE);
18         matcher.addURI("com.example.content.provider","insert",UPDATE);
19         matcher.addURI("com.example.content.provider","insert",QUERY);
20     }

在query方法中,我们就可以进行判断,如果Uri吻合,我们就响应相应的操作。不吻合,那么就抛出异常

 1 public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {
 2         /**
 3          * 检查传入的路径是否匹配,如果匹配成功返回QUERY,否则就返回-1
 4          */
 5         if(matcher.match(uri)==QUERY){
 6             //匹配成功
 7         }else{
 8             throw new RuntimeException("路径不合法");
 9         }
10         return null;
11     }

匹配成功后,我们可以做的事很多,比如操作数据库,这里有一点十分重要,当我们利用内容提供者去操作数据库时,千万不要手动的关闭数据库。因为内容提供者会自动的关闭数据库的。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。