ContentProvider和ContentProvider的使用和原理

来源:互联网 发布:淘宝买家秀大尺度集合 编辑:程序博客网 时间:2024/05/16 16:17

1.首先ContentProviderActivity/Service/BroadcastReceiver一样,对于继承了基类的各个实例子类都需要再Manifest 中进行配置(如何配置见后面,很简单),当一个应用程序需要把自己的数据暴露给其他程序使用时,该应用程序就可以通过ContentProvider来实现,其他应用程序就可以通过我们后面将介绍的一个类:ContentResolver来取出ContentProvider中暴露的数据,注意:只要提供了供外部访问数据的ContentProvider,那么其他应用都可以通过这个“地址”或者叫“接口”来访问数据提供者,进行增删改查等操作,而不管提供者是否启动。(这点和数据库很像,前提是得有权限访问)
2.这里写图片描述
这里有个问题需要注意:
表面上是A根据网址直接增删改查应用B,其实都是根据Uri直接转到应用B中对应的增删改查方法,根据应用A提供的参数来执行具体的行为。
3. 创建ContentProvider
3.1继承ContentProvider
3.2注册contentProvider,在配置文件manifest中注册自己,包括name(注册类地址),authorities(接口的地址Uri),exported(是否被访问数据),如下:

<application  .....>        <provider            android:name=".ContentProviderDemo"            android:authorities="com.example.contentprovider"            android:exported="true"  /></application>

3.3我们再到具体的继承了ContentProvider的子类ContentProviderDemo中,根据数据访问的增删改查来看看具体的方法和参数,注意,这里的增删改查与实际的数据库操作增删改查方法名称一样,但是参数不同。
方法1
//当第三方应用第一次访问ContentProvider时,该ContentProviderDemo就会被创建,被创建之后立即回调onCreate(public boolean onCreate(){}
方法2
//根据该Uri插入values对应的数据,注意,这个方法必须依托实际的SQL语句进行操作,他不是实际的数据库操作方法,需要在方法内手动添加sql语句,同时这里的Uri传入的是并非仅是该子类注册的authorities对应的Uri,这里的参数Uri一般在注册的Uri的基础上添加了资源部分,具体见下面介绍的Uri
public Uri insert(Uri uri,ContentValues values){}
方法3
//根据uri删除selection条件所匹配的全
public int delete(Uri uri,String where,String[]whereArgs)
参数:uri增加了资源部分的Uri
参数:where满足该参数的记录将删除
参数:whereArgs 用于为where传入参数

方法3
//根据Uri修改where参数所匹配的记录,这里的参数和上面的作用类似,不再介绍了

public int update(Uri uri,ContentValues values,String where,String[] whereArgs,){}

方法4
//根据Uri查询出where条件所匹配的全部记录,project是一个列名列表,表明只选择出指定的数据列

public Cursor query(Uri uri,String [] projection,String where,String[]whereArgs,String sortOrder){}

//例如:
Cursor cursor = contentResolver.query(Words.word.DICT_CONTENT_URI,null,"words like ? or detail like ?",new String[]{"%"+key+"%","%"+key+"%"},null);

方法5
//用于返回当前Uri代表的数据的MIME类型,关于MIME在下面介绍

public String getType(Uri uri){}

如果Uri是多条记录(words):return vnd:android.cursor.dir/开头
如果Uri是单挑记录(word/#):return vnd:android.cursor.item/开头。
4.获取ContentResolver
4.1、如何获取ContentResolver()方法?
通过Context的ContentResolver()方法可以取出ContentResolver对象,既然Context能取出,那么Activity、Service都可以通过getContentResolver()方法取出ContentResolver对象
4.2、取出当前的 ContentResolver对象之后如何操作数据呢?
既然取出了相应的ContentResolver对象,那么就调用ContentResolver.query()/insert()/update()/delete()等方法进行操作数据,记住,这里的加载顺序是:ContentResolver的增删改查方法根据Uri匹配到对应的数据提供者ContentProvider,然后自动调用ContentProvider中的对应的增删改查方法。

虽然Application创建在前,但ContentProvider的onCreate方法调用却在Application的onCreate之前.当ContentProvider所在的进程启动的时候,它会同时被启动并被发布到AMS中,这个时候它的onCreate要先去Application的onCreate执行。
ActivityThread.handleBindApplication方法
1.创建ContextImpl和Instrumentation
2.创建Application对象
3.启动ContentProvider所在进程并调用OnCreate方法
4.调用Application的OnCreate方法

参考:
http://blog.csdn.net/tianmi1988/article/details/51077378

阅读全文
1 0