Android四大组件之:ContentProvider

来源:互联网 发布:重庆大学网络教育官网 编辑:程序博客网 时间:2024/06/08 01:28

     每日一搏之Android四大组件之:ContentProvider

 今天是Android四大组件的最后一篇啦!有点小成就,有点小激动。废话少说,进入主题。

ContentProvider中文:内容提供者。字面意识就是把自己的内容提供给被人的人。在Android中的意思就是把app自己的数据提供给其他app,或者说共享给其他app。共享的权限可以自己设置,主要有增删改查。比如现在很多app可以获取到手机联系人或者获取到手机里面的图片。那么提供联系人的就做内容提供者,而去获取这些内容的叫做内容解析者。

下面通过一个Dome来认识这个组件。


  今天的案例没有界面,主要有以上几个java类,DbHelper  这里类是一个SQLite 的实现,主要就是创建一个表,具体的就不在这里讲了,大家可以下载Dome。

MainActivity  这个是app的主类,今天没用到

MyContentProvider 这个是几天的主要内容,主要用来创建一个内容提供者和一些实现方法

MyTest 这个是一个测试类,因为用两个app来测试比较麻烦,所以我们可以用一个测试类来代替,实现测试类需要在AndroidManif.xml 中注册。

下面贴代码

<span style="font-family:FangSong_GB2312;font-size:14px;">//声明日志标识private static final String Tag = "MyContentProvider";  //声明一个SQLiteprivate DbHelper helper;//声明两个标识private static final int STUDENTS = 1;      //表示对数据库进行多行操作private static final int STUDENT = 2;     //表示对数据库进行单行操作//声明一个Uri管理类private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);  //UriMatcher.NO_MATCH 表示没有匹配的//为uriMatcher 添加两个静态的uristatic {uriMatcher.addURI("com.example.contentproviderdemo.MyContentProvider",   //这里一个参数就是我们的内容提供者的标识"student", STUDENTS);uriMatcher.addURI("com.example.contentproviderdemo.MyContentProvider","student/#", STUDENT);}//获取Type//通过返回一个字符串,系统可以判断是进行多条操作还是单条操作@Overridepublic String getType(Uri uri) {int flag = uriMatcher.match(uri);switch (flag) {case STUDENT:return "vnd.android.cursor.item/student";case STUDENTS:return "vnd.android.cursor.dir/student";}return null;}//对数据库进行插入数据的操作@Overridepublic Uri insert(Uri uri, ContentValues values) {// insert into student values(?,?)Uri resultUri = null;int flag = uriMatcher.match(uri);switch (flag) {case STUDENTS:SQLiteDatabase database = helper.getWritableDatabase();  //创建数据库操作类long id = database.insert("student", null, values);      resultUri = ContentUris.withAppendedId(uri, id);         这里需要返回一个uri类给其他app使用Log.i(Tag, resultUri.toString());return resultUri;}return null;}//创建内容提供者@Overridepublic boolean onCreate() {helper = new DbHelper(getContext()); //实例化SQLitereturn false;}</span>

这里我实现一个插入操作,其他查询,修改,删除都是差不多的,只要按照正常的SQLite操作基本都可以实现。

上面说到一个内容提供者的标识,是什么呢?系统中有很多内容提供者,那系统要如何区分它们呢?就想我们的身份证一样,系统通过这个标识才能找到这个内容提供者。

同时内容解析者也通过标识才能获取内容。

到这里就实现了内容提供者的创建,下面我们来实现一个测试类

<span style="font-family:FangSong_GB2312;font-size:14px;">public class MyTest extends AndroidTestCase {public void insertDB() {//创建一个内容解析者ContentResolver contentResolver = getContext().getContentResolver();//创建一个uri 使用content://+授权路径Uri uri = Uri.parse("content://com.example.contentproviderdemo.MyContentProvider/student");//创建插入的数据ContentValues values = new ContentValues();values.put("name", "张三");values.put("address", "北京");//内容解析者直接执行内容提供者中的已经定义好的方法contentResolver.insert(uri, values);}</span>

这是一个测试类,其中有用到一个uri。

Uri代表了要操作的数据,Uri主要包含了两部分信息
①需要操作的ContentProvider
②对ContentProvider中的什么数据进行操作

 

组成部分
①scheme:ContentProvider的scheme已经由Android所规定为content://
②主机名(Authority):用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。建议为公司域名,保持唯一性
③路径(path):可以用来表示我们要操作的数据,路径的构建应根据业务而定:

 

要操作person表中id为10的记录
content://cn.xyCompany.providers.personProvider/person/10

 

要操作person表中id为10的记录的name字段
content://cn.xyCompany.providers.personProvider/person/10/name

 

要操作person表中的所有记录
content://cn.xyCompany.providers.personProvider/person


内容提供者的基本内容就是这些啦,这样看内容提供者好像没什么用啊。其实大有用处。比如现在很多手机可以直接获取到手机联系人,这个就是一个内容提供者的应用。好的,那么Android四大组件就到这里啦。接下来给我两天时间,我将写一个融合Android四大组件的小案例,大家敬请期待。


鄙人林小白,英文名:LinLitterWhite,Android领域的小小白,博文中有错的地方,欢迎大家指出!必将重谢!晚安



案例下载




0 0