关闭

Android四大组件之:ContentProvider

标签: androidAndroid四大组件之ContentP
94人阅读 评论(0) 收藏 举报

     每日一搏之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";  

	//声明一个SQLite
	private 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 添加两个静态的uri
	static {
		uriMatcher.addURI("com.example.contentproviderdemo.MyContentProvider",   //这里一个参数就是我们的内容提供者的标识
				"student", STUDENTS);
		uriMatcher.addURI("com.example.contentproviderdemo.MyContentProvider",
				"student/#", STUDENT);
	}

	//获取Type
	//通过返回一个字符串,系统可以判断是进行多条操作还是单条操作
	@Override
	public 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;
	}

	//对数据库进行插入数据的操作
	@Override
	public 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;
	}

	//创建内容提供者
	@Override
	public boolean onCreate() {
		helper = new DbHelper(getContext()); //实例化SQLite
		return 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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2228次
    • 积分:188
    • 等级:
    • 排名:千里之外
    • 原创:17篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论