写在前面
当我们想要读取写入第三方app的数据库的时候怎么办?默认android系统是有权限限制不能访问别的app的数据库的,那么我们应该怎么做,才能让app可以读取别的app的数据库,ContentProvider就应用而生了,专门用于app的数据库访问读取操作。
provider提供者
作为provider的提供者,我们至少要准备的两个文件AndroidManifest.xml和继承自ContentProvider的类,下面来看下具体的实现。
AndroidManifest.xml
name为自定义ContentProvider完整类名。
authorities为自定义认证字符串,类似Activity、Broadcast和Service定义的隐式启动的action字符串,第三方应用要想调用到本provider就得用这个authorities的字符串。
exported为true表示可以被其他应用访问。
MyContentProvider.java
MyContentProvider是继承自ContentProvider的类,默认会重写onCreate、query、getType、insert、delete、update等方法。在MyContentProvider中我们初始化了UriMatcher并addURI了两条uri,那么UriMatcher是做什么的呢?其实它就像一个过滤网,比如我们有很多种AUTHORITY = “com.pachong.myprovider”的uri,但是我们并不想每一种都处理,只处理我们要处理里的某一条或者某几条uri,那要怎么办呢?这个时候就得有我们的过滤装置UriMatcher了,UriMatcher通过addURI预设我们要处理的uri,然后通过match来比较uri是否是我们预设的uri,如果是就返回想要的code,这样我们就可以做特定的操作了。MyContentProvider类中我没有做数据库的操作,想进一步深入的朋友可以参考ContentProvider数据库共享之——实例讲解。query、insert、delete、update等都是对应的数据库操作方法,我们只要match出相应的uri,做处理就ok了。在insert、delete、update方法中我们加了一句getContext().getContentResolver().notifyChange(uri, null);加这句话的目的是通知相关的调用者本provider有数据更新。另外getType与启动指定的Activity或者Service中这个属性有关,不多说了,可以参考ContentProvider数据库共享之——MIME类型与getType()做深入了解。
provider调用者
再起一个新的app,然后实现下面的代码做测试。主要用到的方法getContentResolver()的insert、query、delete、update、registerContentObserver和unregisterContentObserver。
Main.java
Main.java中我声明了3条了Uri,其中有两条是和MyContentProvider匹配的,另外一条是不匹配的。这样做的目的就是测试前面所说UriMatcher.match的作用。
main.xml
依次点击上面的四个按钮后,打印的消息如下:
通过log可以看到和MyContentProvider匹配的uri都返回了正确的code,所以我们在做数据库读取操作时一定要和对应的ContentProvider里的uri一致。才能保证操作生效。其他就不多说了,现在也只是通过启舰的博客对ContentProvider有了一定的认识,实际项目中还没有用到,等到工作中有项目用它再做深入的探究。
参考文章
ContentProvider数据库共享之——概述
ContentProvider数据库共享之——实例讲解
ContentProvider数据库共享之——MIME类型与getType()
ContentProvider数据库共享之——读写权限与数据监听