ContentProvider

来源:互联网 发布:pc蛋蛋计算器单双算法 编辑:程序博客网 时间:2024/06/09 16:06

1 ContentProvider介绍

ContentProvider:为存储和获取数据提供了统一的接口;

使用ContentProvider可以在不同应用程序之间共享数据,是应用程序间共享数据的唯一方法;

在Android中没有一块公共的,所有应用程序都能访问的数据存储的地方;

android为常见的一些数据提供了ContentProvider(包括音视频,图片,通讯录等等);

ContentProvider使用表的形式来组织数据:

每一个ContentProvider都拥有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据;

所有的ContentProvider的URI都以字符串“content://”开始:【content://com.example.transportationprovider/trans/122】的四个部分

Android所提供的ContentProvider都存放在androi.provider包当中

2 ContentProvider所提供的方法


3 实现ContentProvider的过程

前提是,存在一个用于存放数据的系统

① 定义一个继承自ContentProvider的类

②声明一个Uri类型的常量CONTENT_URI

 ③实现query()、 insert()、 update()、 delete()、 getType()、 onCreate()

 ④在AndroidManifest.xml文件中进行声明


3.1 定义一个CONTENT_URI常量

public static final String AUTHORIY = "com.example.handler.FirstContentProvider";// 访问ContentProvider的URIpublic static final Uri CONTENT_URI = Uri.parse("content://"+AUTHORIY+"/users");

3.2 定义一个类,继承ContentProvider

实现query、insert、onCreate等方法

public class FirstContentProvider extends ContentProvider {// 操作URI的类public static final UriMatcher uriMatcher;// 访问所有的列public static final int INCOMING_USER_COLLECTION = 1;// 访问单独的列public static final int INCOMING_USER_SINGLE = 2;private DatabaseHelper dh;// 为UriMatcher添加自定义的URIstatic {uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/users",INCOMING_USER_COLLECTION);uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/users/#",INCOMING_USER_SINGLE);}// 为数据库表字段起别名public static HashMap<String, String> userProjectionMap;static {userProjectionMap = new HashMap<String, String>();userProjectionMap.put(UserTableMetaData._ID, UserTableMetaData._ID);userProjectionMap.put(UserTableMetaData.USER_NAME,UserTableMetaData.USER_NAME);}@Overridepublic int delete(Uri arg0, String arg1, String[] arg2) {// TODO Auto-generated method stubSystem.out.println("delete");return 0;}// 根据传入的URI,返回URI所表示的数据类型@Overridepublic String getType(Uri uri) {// TODO Auto-generated method stubSystem.out.println("getType");switch (uriMatcher.match(uri)) {case INCOMING_USER_COLLECTION:return UserTableMetaData.CONTENT_TYPE;case INCOMING_USER_SINGLE:return UserTableMetaData.CONTENT_TYPE_ITEM;default:throw new IllegalArgumentException("Unknown URI " + uri);}}// 该函数的返回值是一个URI,这个URi表示的是刚刚所插入的数据@Overridepublic Uri insert(Uri uri, ContentValues values) {// TODO Auto-generated method stubSystem.out.println("insert");SQLiteDatabase db = dh.getWritableDatabase();long rowId = db.insert(UserTableMetaData.TABLE_NAME, null, values);if (rowId > 0) {Uri insertedUserUri = ContentUris.withAppendedId(UserTableMetaData.CONTENT_URI, rowId);// 通知监听器,数据已经改变getContext().getContentResolver().notifyChange(insertedUserUri,null);return insertedUserUri;}throw new SQLException("Failed to insert row into " + uri);}// 是一个回调方法,在ContentProvider创建时调用@Overridepublic boolean onCreate() {// TODO Auto-generated method stubSystem.out.println("onCreate");// 打开数据库dh = new DatabaseHelper(getContext(),FirstProviderMetaData.DATABASE_NAME);return false;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {// TODO Auto-generated method stubSystem.out.println("query");SQLiteQueryBuilder qb = new SQLiteQueryBuilder();switch (uriMatcher.match(uri)) {case INCOMING_USER_COLLECTION:qb.setTables(UserTableMetaData.TABLE_NAME);qb.setProjectionMap(userProjectionMap);break;case INCOMING_USER_SINGLE:qb.setTables(UserTableMetaData.TABLE_NAME);qb.setProjectionMap(userProjectionMap);// 追加条件,getPathSegments()得到用户请求的Uri地址截取的数组;get(1)得到去掉地址中/以后的第二个元素qb.appendWhere(UserTableMetaData._ID + "="+ uri.getPathSegments().get(1));default:break;}String orderBy;if (TextUtils.isEmpty(sortOrder)) {orderBy = UserTableMetaData.DEFAULT_SORT_ORDER;} else {orderBy = sortOrder;}SQLiteDatabase db = dh.getWritableDatabase();Cursor c = qb.query(db, projection, selection, selectionArgs, null,null, orderBy);c.setNotificationUri(getContext().getContentResolver(), uri);return c;}@Overridepublic int update(Uri uri, ContentValues values, String arg2, String[] arg3) {// TODO Auto-generated method stubSystem.out.println("update");return 0;}}


为ContentProvider提供一个常量类(Uri也可以定义在这里):

public class FirstProviderMetaData {public static final String AUTHORIY = "com.example.handler.FirstContentProvider";// 数据库名称public static final String DATABASE_NAME = "FirstProvider.db";// 数据库版本public static final int DATABASE_VERSION = 1;// 表名public static final String USERS_TABLE_NAME = "users";public static final class UserTableMetaData implements BaseColumns {// 表名public static final String TABLE_NAME = "users";// 访问ContentProvider的URIpublic static final Uri CONTENT_URI = Uri.parse("content://"+AUTHORIY+"/users");// 该ContentProvider所返回的数据类型定义public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.firstprovider.user";public static final String CONTENT_TYPE_ITEM = "vnd.android.cursor.item/vnd.firstprovider.user";// 列名public static final String USER_NAME = "name";// 默认排序方式public static final String DEFAULT_SORT_ORDER = "_id desc";}}

为ContentProvider提供一个数据库访问类:

public class DatabaseHelper extends SQLiteOpenHelper {private static final int VERSION = 1;// 当前对象,表名, , 版本public DatabaseHelper(Context context, String name, CursorFactory factory,int version) {super(context, name, factory, version);// TODO Auto-generated constructor stub}public DatabaseHelper(Context context, String name, int version) {this(context, name, null, version);}public DatabaseHelper(Context context, String name) {this(context, name, VERSION);}// 第一次创建数据库的时候调用@Overridepublic void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stubSystem.out.println("create a database");db.execSQL("create table "+FirstProviderMetaData.USERS_TABLE_NAME+"( " + FirstProviderMetaData.UserTableMetaData._ID +" INTEGER PRIMARY KEY AUTOINCREMENT,"+ FirstProviderMetaData.UserTableMetaData.USER_NAME +" varchar(20))");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stubSystem.out.println("update a database");}}


3.3 在AndroidManifest.xml中进行配置

<application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name="com.example.handler.SQLiteActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <provider android:name="com.example.handler.FirstContentProvider"            android:authorities="com.example.handler.FirstContentProvider"            />  <!-- 在这里配置 -->    </application>


4 使用ContentProvider

MainActivity.java:

public class MainActivity extends Activity {private static final int ONE = 1;private static final int TWO = 2;private static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.btnAdd1).setOnClickListener(listener);findViewById(R.id.btnAdd2).setOnClickListener(listener);findViewById(R.id.btnupdate1).setOnClickListener(listener);findViewById(R.id.btnupdate2).setOnClickListener(listener);findViewById(R.id.btnQuery1).setOnClickListener(listener);findViewById(R.id.btnQuery2).setOnClickListener(listener);findViewById(R.id.btnDel1).setOnClickListener(listener);findViewById(R.id.btnDel2).setOnClickListener(listener);}private OnClickListener listener = new OnClickListener() {@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btnAdd1:add(ONE);break;case R.id.btnAdd2:add(TWO);break;case R.id.btnupdate1:update(ONE);break;case R.id.btnupdate2:update(TWO);break;case R.id.btnQuery1:query(ONE);break;case R.id.btnQuery2:query(TWO);break;case R.id.btnDel1:delete(ONE);break;case R.id.btnDel2:delete(TWO);break;default:break;}}};protected void add(int type) {ContentResolver contentResolver = getContentResolver();Uri uri = null;ContentValues values = new ContentValues();switch (type) {case ONE:uri = Uri.parse("content://com.example.contentprovider/student");values.put("name", "libai");values.put("age", "100");Log.i(TAG, contentResolver.insert(uri, values).toString());break;case TWO:uri = Uri.parse("content://com.example.contentprovider/student/1");values.put("name", "dufu");values.put("age", "101");Log.i(TAG, contentResolver.insert(uri, values).toString());break;default:break;}}protected void update(int type) {ContentResolver contentResolver = getContentResolver();Uri uri = null;ContentValues values = new ContentValues();String where = "";String[] selectionArgs = null;switch (type) {case ONE:uri = Uri.parse("content://com.example.contentprovider/student");values.put("name", "updated");values.put("age", "23");where = "sid = ?";selectionArgs = new String[]{"1"};contentResolver.update(uri, values, where, selectionArgs);break;case TWO:uri = Uri.parse("content://com.example.contentprovider/student/2");values.put("name", "Updated");values.put("age", "23");where = null;selectionArgs = null;contentResolver.update(uri, values, where, selectionArgs);break;default:break;}}protected void query(int type) {ContentResolver contentResolver = getContentResolver();Uri uri = null;String[] projection = new String[]{"sid", "name", "age"};String selection = "";String[] selectionArgs = null;String sortOrder = "";Cursor cursor = null;switch (type) {case ONE:uri = Uri.parse("content://com.example.contentprovider/student");selection = "sid < ?";selectionArgs = new String[]{"3"};cursor=contentResolver.query(uri, projection, selection, selectionArgs, sortOrder);while(cursor.moveToNext()) {Log.i(TAG, "sid="+cursor.getInt(0)+"; name="+cursor.getString(1)+"; age="+cursor.getInt(2));}break;case TWO:uri = Uri.parse("content://com.example.contentprovider/student/1");cursor=contentResolver.query(uri, projection, selection, selectionArgs, sortOrder);while(cursor.moveToNext()) {Log.i(TAG, "sid="+cursor.getInt(0)+"; name="+cursor.getString(1)+"; age="+cursor.getInt(2));}break;default:break;}}protected void delete(int type) {ContentResolver contentResolver = getContentResolver();Uri uri = null;String where = "";String[] selectionArgs = null;switch (type) {case ONE:uri = Uri.parse("content://com.example.contentprovider/student");where = "sid in(?, ?)";selectionArgs = new String[]{"1", "2"};contentResolver.delete(uri, where, selectionArgs);break;case TWO:uri = Uri.parse("content://com.example.contentprovider/student/2");where = null;selectionArgs = null;contentResolver.delete(uri, where, selectionArgs);break;default:break;}}}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 纹完身后喝酒了怎么办 孩子学习态度不端正怎么办 孩子高考三模考差了家长怎么办 一年级学生学习马虎大意怎么办 一年级下册孩子做作业马虎怎么办 一年级孩子做题马虎怎么办 四年级小孩不喜欢数学该怎么办 工作出了大错误怎么办 遇到不讲道理的人怎么办 四岁宝宝爱生闷气怎么办 一岁宝宝没耐心怎么办 孩子挑食 幼儿园老师该怎么办 小孩被惯的无法无天怎么办 高中的儿子不写作业怎么办 儿子总是不写作业怎么办 长鸡眼脚背肿了怎么办 脚上反复长鸡眼怎么办 脚底长鸡眼很痒怎么办 小脚趾上长鸡眼怎么办 6岁宝宝不爱学习怎么办 上班站久了腿肿怎么办 站时间长了腿肿怎么办 孩子做作业老是粗心大意怎么办 高中孩子没学习兴趣怎么办 初三孩子失去学习兴趣怎么办 初二对学习兴趣不大怎么办 脸上痒发红发肿怎么办 孩子作业拖拉爱丢三落四怎么办 腿肌肉按摩肿了怎么办 孩子上一年级成绩差怎么办 小孩脖子拧筋了怎么办 小孩塑料玩具拧不出来怎么办 一年级孩子做数学题粗心怎么办 手和脚有点肿怎么办 手破了之后肿了怎么办 手指肿了有脓怎么办 宝宝手指红肿有脓怎么办 孩子一听做作业就烦气怎么办 虎皮鹦鹉脚瘸了怎么办 虎皮鹦鹉脚受伤了怎么办 虎皮鹦鹉脚流血了怎么办