1.首先ContentProvider
和Activity/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