contentProvider

Android一共有四大组件:activitycontentProviderservice、Broadcast Receiver》》》

下面介绍一下ContentProvider

内容提供者将一些特定的应用程序数据供给其它应用程序使用。数据可以存储于文件系统、SQLite数据库或其它方式。内容提供者继承于ContentProvider 基类,为其它应用程序取用和存储它管理的数据实现了一套标准方法。然而,应用程序并不直接调用这些方法,而是使用一个 ContentResolver 对象,调用它的方法作为替代。ContentResolver可以与任意内容提供者进行会话,与其合作来对所有相关交互通讯进行管理。

1contentProvider可以让不同程序之间的数据进行交换,它把不同应用程序的数据库操作标准统一起来,并且将这个标准暴露给其他应用程序。

2ContentProvider的操作方法

a) Boolean onCreate()    //启动组件时调用

b) Int delete(Uri uriString selectionSting [ ] selectionArgs
// 根据指定的uri删除数据,并返回删除的数据行数

c) Finnal Context getContext()
//  返回context对象

d) String getType(Uril uril)
//  根据指定的uri返回操作的MIME类型

e) 

f) Uril insert(Uri uri,ContextVaules,values )
//  根据指定的uri进行增加数据的操作,并且返回增加后的uri在此uri中会附带新的数据的id

g) Cursor query(Uri uri, String [ ]projectionString selectionString[ ]selectionArgs,String sortOrder )
//根据指定的uri执行查询操作,所有的查询结果通过cursor对象返回

h) Int update (Uri uriContentValues ValuesString selectionstring[]selectionArgs)

//  根据指定的uri进行数据的更新操作,并且返回更新数据的行数

3、Uri类常用的方法:

String decode(String s)  // 对字符串进行编码

String encode(String s)   //对编码后的字符串进行解码

Uri fromFile(File file)   // 从指定的文件之中读取uri

Uri withAppendedPath(Uri baseUriString pathSegment

//  uri后面加参数 

Uri parseString uriString)  // 将给出的字符串地址变为uri对象

4、Uri 解释:

content://hup.lyl.contentProvider/mytable/3

//  Content://包名(一般情况下)/数据表/id

Content:  //  协议

Authority(包名):  //  外部调用者可以根据这个标识找到它。要用小写字母。

Pathmytable/3): 

 //   content://Authority/Path      表的全部数据

//   content://Authority/Path/id       id的数据

//   content://Authority/Path/id/属性   属性内容

注意:

a)如果操作的数据属于集合类型(拿全部数据),那么MIME类型字符串应该以vnd.android.cursor.dir/开头.   

//  Uri为content://com.ljq.provider.personprovider/person,那么返回的MIME类型字符串应该为:"vnd.android.cursor.dir/person"。

b)如果要操作的数据属于非集合类型数据(拿单个数据),那么MIME类型字符串应该以vnd.android.cursor.item/开头.

//  Uri为content://com.ljq.provider.personprovider/person,那么返回的MIME类型字符串应该为:"vnd.android.cursor.item/person"。

c)  用 DESC 表示按倒序排序(即:从大到小排序)

  //  SORT_ORDER="_id DESC"
d)  用 ACS   表示按正序排序(即:从小到大排序)

5、UriMatcher匹配uri

UriMatcher  sMatcher = new UriMatcher(UriMatcher.NO_MATCH); 
   //    常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码 
        sMatcher.addURI(com.xxx.provider.myproviderperson, 1); 

//添加需要匹配uri,如果匹配就会返回匹配码  对全部数据操作

  //  如果match()方法匹配content://com.xxx.provider.myprovider/person路径,返回匹配码为
        sMatcher.addURI(com.xxx.provider.myproviderperson / #, 2);  

//    #号为通配符   对单个数据操作
        //如果match()方法匹配content://com.xxx.provider.myprovider/person/230路径,返回匹配码为

6、contentProvider在程序的操作中只是提供一个操作标准,所以需要用到Android.content.ContentResolve类完成,这个类的操作方法是和contentProvider一一对应的,调用它的方法就相当于调用了contentProvider的方法。

7、contentResolver是一个抽象类,所以想要取得contentResolver类的实例化对象进行操作,则需要依靠Android.app.activity类的方法

Public contentResolve getcontentResolve()

8、uri的辅助操作类:contentUris

由于所有数据都要通过uri进行传递,以增加操作为例,当用户执行完增加数据操作后,往往需要增加后的数据id通过uri进行返回,当接收到这个uri的时候就需要从里面取得增加数据的id

这时就用到了Android.content.contentUris的辅助工具类:

指定的uri中取出idlong parseId(uri contentUri

指定的uri之后增加id参数: uri withAppendedId(uri ContentUrilong id

8、SQLite的表格实现BaseColumns接口:

BaseColumns简单的添加两个字段
public static final String _ID = "_id";
public static final String _COUNT = "_count";

使用通用名称无论对其整体结构 (即其他非 ID 列) 以统一的方式可以解决任何数据的项目,Android 平台 (和开发人员以及)。在接口/类中定义的常用的字符串常量可以避免一般和各地代码的拼写错误。

      



原文地址:https://www.cnblogs.com/mydomainlistentome/p/4397934.html