【转】内容提供器ContentProvider的原理及运用

【转】内容提供器ContentProvider的原理及应用

原文地址:http://1622511.blog.51cto.com/1612511/567337
在Android中的程序与程序之间数据都是私有的,即在程序A中创建的数据库或者文件只能由A自身使用,其他程序无法直接使用A中创建的数据库信息和文件信息,这样保证了程序与程序之间的独立性和数据安全。但是这样会导致在需要使用同样的数据时候数据重复声明和重复创建,产生了数据的冗余。

那么我们如何能够更好的使得不同程序之间数据的独立,而又可以在需要共享数据的时候能够有共同操作数据的桥梁呢?为了解决这个问题,Android设计了一种称为内容提供器的技术,从而为内容共享提供了支持,这就是Android的重要组件ContentProvider。我们举个例子,如果没有内容提供器,那么我们如果在需要得到手机上面的某个联系人信息就不可能得到,因此ContentProvider的作用就在于此。

ContentProvider是个什么样的东西?概况的说,ContentProvider就是为其他程序提供一个对数据访问的接口,从而可以实现对数据进行访问和更新的操作。要实现ContentProvider,需要继承ContentProvider父类并覆盖其抽象方法,这些方法即是访问和更新数据的方法。

1、删除符合指定条件的记录

   
public int delete(Uri uri, String selection, String[] selectionArgs); 



2、插入一个新的记录 

   
public Uri insert(Uri uri, ContentValues values); 



3、查询符合指定条件的记录

   
public Cursor query(Uri uri, String[] projecttion, String selection, String[] selectionArgs, String sortOrder);



4、更新条例指定条件的记录 

   
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs); 



5、基于给定uri,返回该uri表示的类型

   
public String getType(Uri uri);



6、创建数据储存后端,如数据库,文件,网络接口等,这里主要进行初始化工作

  
 public boolean onCreate();  


由以上方法即可以完成ContentProvider的创建,完成了数据存储的连接以及各种数据操作,有关数据存储类型可以有数据库、文件甚至是网络存储。

那么,在其他程序中如何使用以上定义的ContentProvider呢?
首先,需要在AndroidManifest.xml中声明以上定义的ContentProvider。

   
<provider android:name="MProvider" android:authorities="ataaw.MProvider" />


在程序中使用ContentProvider是通过ContentResolver来操作,同样地,ContentResolver中也具有ContentProvider中同样名称的方法,这好对于ContentProvider中的各个操作方法,因此操作的结果就是回调ContentProvider中定义的各个方法。

   
ContentResolver.insert(Uri uri, ContentValues values);//插入数据
    ContentResolver.delete (Uri url, String where, String[] selectionArgs);//删除数据
    ContentResolver.update(Uri uri, ContentValues values, String where, String[] selectionArgs);//更新数据


这里涉及到一个叫Uri的内容,这便是程序提供给外界程序的接口地址,一般情况下,接口地址定义如下(包括包名、provider和记录ID):
进一步学习可参考:http://www.cnblogs.com/linjiqin/archive/2011/05/28/2061396.html