Android一共有四大组件:activity、contentProvider、service、Broadcast Receiver》》》
下面介绍一下ContentProvider:
内容提供者将一些特定的应用程序数据供给其它应用程序使用。数据可以存储于文件系统、SQLite数据库或其它方式。内容提供者继承于ContentProvider 基类,为其它应用程序取用和存储它管理的数据实现了一套标准方法。然而,应用程序并不直接调用这些方法,而是使用一个 ContentResolver 对象,调用它的方法作为替代。ContentResolver可以与任意内容提供者进行会话,与其合作来对所有相关交互通讯进行管理。
1、contentProvider可以让不同程序之间的数据进行交换,它把不同应用程序的数据库操作标准统一起来,并且将这个标准暴露给其他应用程序。
2、ContentProvider的操作方法
a) Boolean onCreate() //启动组件时调用
b) Int delete(Uri uri,String selection,Sting [ ] 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 [ ]projection,String selection,String[ ]selectionArgs,String sortOrder )
//根据指定的uri执行查询操作,所有的查询结果通过cursor对象返回
h) Int update (Uri uri,ContentValues Values,String selection,string[]selectionArgs)
// 根据指定的uri进行数据的更新操作,并且返回更新数据的行数
3、Uri类常用的方法:
String decode(String s) // 对字符串进行编码
String encode(String s) //对编码后的字符串进行解码
Uri fromFile(File file) // 从指定的文件之中读取uri
Uri withAppendedPath(Uri baseUri,String pathSegment)
// 在uri后面加参数
Uri parse(String uriString) // 将给出的字符串地址变为uri对象
4、Uri 解释:
content://hup.lyl.contentProvider/mytable/3
// Content://包名(一般情况下)/数据表/id
Content: // 协议
Authority(包名): // 外部调用者可以根据这个标识找到它。要用小写字母。
Path(mytable/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.myprovider”, “person”, 1);
//添加需要匹配uri,如果匹配就会返回匹配码 对全部数据操作
// 如果match()方法匹配content://com.xxx.provider.myprovider/person路径,返回匹配码为1
sMatcher.addURI(“com.xxx.provider.myprovider”, “person / #”, 2);
// #号为通配符 对单个数据操作
//如果match()方法匹配content://com.xxx.provider.myprovider/person/230路径,返回匹配码为2
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中取出id:long parseId(uri contentUri)
指定的uri之后增加id参数: uri withAppendedId(uri ContentUri,long id)
8、SQLite的表格实现BaseColumns接口:
BaseColumns简单的添加两个字段
public static final String _ID = "_id";
public static final String _COUNT = "_count";
使用通用名称无论对其整体结构 (即其他非 ID 列) 以统一的方式可以解决任何数据的项目,Android 平台 (和开发人员以及)。在接口/类中定义的常用的字符串常量可以避免一般和各地代码的拼写错误。