内容提供者

内容提供者是Android中的四大组件之一,可以将应用中的数据对外进行共享

    内容提供者中数据更改可被监听

内容提供者类  ContentProvider

通过Context获得ContentResolver对象

调用ContentResolver对象的方法即可访问内容提供者

package com.heima.proveders;

import com.heima.sqlitedemo.db.personSQLITEOpenHelper;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
//内容提供者是四大主键    所以都需要在配置清单里面配置
public class provedersCase extends ContentProvider {

	private static final String AUTHORITY="com.heima.proveders.provedersCase";
	private static final int PERSON_INSERT_CODE = 0;//操作person表添加的操作的uri匹配码
	private static final int PERSON_QUERY_ALL_CODE = 3;
	private static final int PERSON_UPDATE_CODE = 2;
	private static final int PERSON_DELETE_CODE = 1;
	private static final int PERSON_QUERY_ITEM_CODE = 4;

	//UriMatcher类用于匹配Uri
	private static UriMatcher ruiMatcher;
	private personSQLITEOpenHelper mOpenHelper = null;
	static{
		//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
		ruiMatcher = new UriMatcher(UriMatcher.NO_MATCH);//参数是不匹配时返回值的类型

		//添加一些uri(分机号)
		//1唯一标识   手机号
		//要干的事     分机号	person/insert是要在person这个表进行insert操作
		ruiMatcher.addURI(AUTHORITY, "person/insert", PERSON_INSERT_CODE);
		ruiMatcher.addURI(AUTHORITY, "person/delete", PERSON_DELETE_CODE);
		ruiMatcher.addURI(AUTHORITY, "person/update", PERSON_UPDATE_CODE);
		ruiMatcher.addURI(AUTHORITY, "person/queryAll", PERSON_QUERY_ALL_CODE);

		//特殊的符号   #
		ruiMatcher.addURI(AUTHORITY, "person/query/#", PERSON_QUERY_ITEM_CODE);

	}

	@Override
	public boolean onCreate() {
		// TODO Auto-generated method stub
		//刚创建的时候就把数据库操作帮助类给实例化出来
		mOpenHelper = new personSQLITEOpenHelper(getContext());
		return true;
	}

	@Override
	public int delete(Uri arg0, String arg1, String[] arg2) {
		// TODO Auto-generated method stub
		int sign = ruiMatcher.match(arg0);
		switch (sign) {
		case PERSON_DELETE_CODE:
			SQLiteDatabase db = mOpenHelper.getWritableDatabase();
			if(db.isOpen()){

				int count = db.delete("person", arg1, arg2);

				db.close();
				return count;
			}
			break;

		default:
			throw new IllegalArgumentException("uri不匹配: " + arg1);
		}
		return 0;
	}

	@Override
	public String getType(Uri uri) {  //这个方法只是为了方便系统的调用,完全不管也是可以的
		// TODO Auto-generated method stub
		int sign = ruiMatcher.match(uri);
		switch (sign) {
		case PERSON_QUERY_ALL_CODE: //返回多条的MIME-type
			return "vnd.android.cursor.dir/person";
		case PERSON_QUERY_ITEM_CODE: //查询单个的方法
			return "vnd.android.cursor.item/person";
		default:
			//这里不能抛出异常   直接break就可以了
			break;
		}
		return null;
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		// TODO Auto-generated method stub
		//ruiMatcher不仅可以添加uri	还可以匹配uri
		int sign = ruiMatcher.match(uri);

		switch (sign) {
		case PERSON_INSERT_CODE:
			SQLiteDatabase db = mOpenHelper.getWritableDatabase();
			if(db.isOpen()){
				//执行操作
				long id = db.insert("person", null, values);

				db.close();
				//ContentUris	获取和添加Uri信息
				return ContentUris.withAppendedId(uri, id);//往uri后面再加上一个id
			}
			break;

		default:
			throw new IllegalArgumentException("uri不匹配: " + uri);
		}

		return null;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		// TODO Auto-generated method stub

		int sign = ruiMatcher.match(uri);
		SQLiteDatabase db = mOpenHelper.getReadableDatabase();
		switch (sign) {
		case PERSON_QUERY_ALL_CODE:

			if(db.isOpen()){

				Cursor cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder);
				return cursor;
//				db.close(); 这里的cursor不能关闭   一关闭结果集就没了,返回去也就没用了
			}
			break;
		case PERSON_QUERY_ITEM_CODE:  //查询单个值的情况
			if(db.isOpen()){

				long id = ContentUris.parseId(uri);
				Cursor cursor = db.query("person", projection, "_id = ?", new String[]{"id"}, null, null, sortOrder);
				return cursor;
			}
			break;
		default:
			throw new IllegalArgumentException("uri不匹配: " + uri);
		}

		return null;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		// TODO Auto-generated method stub
		int sign = ruiMatcher.match(uri);
		switch (sign) {
		case PERSON_UPDATE_CODE:
			SQLiteDatabase db = mOpenHelper.getWritableDatabase();
			if(db.isOpen()){

				int count = db.update("person", values, selection, selectionArgs);

				db.close();
				return count;
			}
			break;

		default:
			throw new IllegalArgumentException("uri不匹配: " + uri);
		}
		return 0;
	}

}

内容提供者是四大组件之一,需要在配置清单进行配置

<provider android:name="com.heima.proveders.provedersCase"
     android:authorities="com.heima.proveders.provedersCase">
</provider>
时间: 2024-10-03 23:04:36

内容提供者的相关文章

【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建

数据库的创建和sql语句增删改查 1. 加载驱动. 2. 连接数据库. 3. 操作数据库. 创建表: create table person( _id integer primary key, name varchar(20), age integer ); 添加: insert into person(name, age) values('lisi', 19); 删除: delete from person where _id = 1; 修改: update person set name =

Android 内容提供者的实现

接着上文<Android 内容提供者简介>进一步实现内容提供者. 每个Content Provider类都使用URI(Universal Resource Identifier,通用资源标识符)作为独立的标识,格式如:content://com.example.app.provider/table1.其他应用程序通过不同的uri访问不同的内容提供者,并获取/操作里面的数据. 例如在本项目中对应如下URI: content://com.wuyudong.db.personprovider/ins

[android] 内容提供者简介

产生的原因是,当我们把数据存到数据库的时候,数据库的权限是私有的,把系统的短信应用中的数据库导出来,打开看到address字段是手机的号码,date字段是时间,type字段1,2代表发出去的短信和接受到的短信,body字段代表短信的数据.要想让别的应用程序访问自己数据库的数据,这时需要自己把数据给暴露出来. 新建一个类比如PersonProvider,先继承系统的ContentProvider类,这个类是android四大组件之一,暴露自己的私有数据,别的应用通过ContentResolver类

android100 自定义内容提供者

#ContentProvider,就是来操作数据的,增删改查, * 四大组件之一 * 应用的数据库是不允许其他应用访问的 * 内容提供者的作用就是让别的应用访问到你的数据库 * 内容提供者的作用:把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用 *短信联系人都是在数据库里面.mmssms是短信数据库, *短信数据库有短信数据库的内容提供者,联系人数据库有联系人数据库的内容提供者.拿到对应数据库的内容提供者就能够访问对应的数据库数据. ###短信数据库 * sms表 * body

android 53 ContentProvider内容提供者

ContentProvider内容提供者:像是一个中间件一样,一个媒介一样,可以以标准的增删改差操作对手机的文件.数据库进行增删改差.通过ContentProvider查找sd卡的音频文件,可以提供标准的方法而且不用知道音频文件在那个文件夹里面,只要设置条件就可以找到. 安卓系统把音视频.图片存在系统内部的数据库里面,ContentProvider操作的是数据库不是去文件夹里面去找.sd卡和内存卡的文件安卓系统都会登记,登记文件类型.路径,文件名,文件大小都保存在数据库里.ContentProv

Android四大基本组件(2)之Service 服务与Content Provider内容提供者

一.Service 服务: 一个Service 是一段长生命周期的,没有用户界面的程序,可以用来开发如监控类程序. 比较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器.在一个媒体播放器的应用中,应该会有多个activity,让使用者可以选择歌曲并播放歌曲.然而,音乐重放这个功能并没有对应的activity,因为使用者当然会认为在导航到其它屏幕时音乐应该还在播放的.在这个例子中,媒体播放器这个activity 会使用Context.startService()来启动一个service,从

入门篇:9.组件4:ContentProvider(内容提供者)

android 四大基本组件 的ContentProvider(内容提供者) 这个组件其实就是一个应用进行数据或数据库提供.共享其他应用获取数据的组件,其大致的结构图如下: 其中uri是一个重要的中间媒介. 联系到我们平时用的安卓程序,最常见的就是通讯录.在我们的安卓手机里,通讯录的设计其实是两个程序,其中有一个程序没有用户界面,单纯的存储着联系人信息,并且数据库结构复杂,这也是为了保证数据的安全.另外一个程序就是我们可以看见的通讯录程序.那么第一个程序就是一个ContentProvider,用

Android10_内容提供者_内容观察者_标题栏

安卓四大组件Activity ,Service,BroadCastReceiver,ContentProvider(内容提供者) 1.1内容提供者的作用: 应用程序创建的数据库默认都是私有的,别的应用程序不可以访问里面的数据,如果有需求把自己应用程序私有的数据库暴露给别的用户增删改查,就需要使用内容提供者. 1.2 内容提供者的代码实现 在需要提供给它人数据的应用中 ①创建一个项目,并且创建数据库(数据库开启帮助类)(非必要) ②创建一个类,继承ContentProvider内容提供者, 内容提

Android 中内容提供者的使用

在Android中内容提供者主要是用于不同程序之间的数据共享.内容提供器的用法一般有两种,一种是使用现有的内容提供器来读取和操作相应程序的数据,另一种是创建自己的内容提供器,供其他的程序访问. 使用现有的内容提供器来读取和操作相应程序的数据 ContentResolve中提供了一系列的方法用于对数据进行增删改查的操作,其中,insert()用于添加数据,update()用于数据更新,delete()方法用于删除数据,query()用于数据的查询. 在ContentResolve中,使用内容URI

11.内容提供者

ContentProvider 四大组件之一 内容提供者的作用:把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用 应用的数据库是不允许其他应用访问的,内容提供者的作用就是让别的应用访问到你的数据库 自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查数据库的代码,举例增方法 @Override publicUri insert(Uri uri,ContentValues values){ db.insert("person",n