【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 }
匹配成功后,我们可以做的事很多,比如操作数据库,这里有一点十分重要,当我们利用内容提供者去操作数据库时,千万不要手动的关闭数据库。因为内容提供者会自动的关闭数据库的。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。