android基础笔记:内容提供者及访问(ContentProvider、ContentResolver)

来源:互联网 发布:启明星软件 功能 编辑:程序博客网 时间:2024/06/04 19:02

1、新建一个类,继承ContentProvider,实现未实现的方法(增删改查等)。因为ContentProvider为android系统的四大主键之一,所以需要在清单文件的application节点下注册(包名和主机名):

        <provider
            android:name=".Providers.PersonContentProvider"    
            android:authorities="com.example.SQLiteDemo.Providers.PersonContentProvider" >
        </provider>


2、new 一个uriMatcher,增加需要匹配的uri和对应的返回码:

Uri代表了要操作的数据,Uri主要包含了两部分信息:1:需要操作的ContentProvider ,2:对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:

ContentProvider(内容提供者)的scheme已经由Android所规定, scheme为:content://;

主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它;

路径(path)可以用来表示我们要操作的数据。

private static UriMatcher uriMatcher;private static final String authority = "com.example.SQLiteDemo.Providers.PersonContentProvider";private static final int PERSON_INSERT_CODE = 0;private static final int PERSON_DELETE_CODE = 1;private static final int PERSON_UPDATE_CODE = 2;private static final int PERSON_QUERY_ALL_CODE = 3;private static final int PERSON_QUERY_ITEM_CODE = 4;static {uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(UriMatcher.NO_MATCH的值为-1)//如果match()方法匹配content://com.example.SQLiteDemo.Providers.PersonContentProvider/person/insert路径,返回匹配码为PERSON_INSERT_CODE,也就是0.uriMatcher.addURI(authority, "person/insert", PERSON_INSERT_CODE);uriMatcher.addURI(authority, "person/delete", PERSON_DELETE_CODE);uriMatcher.addURI(authority, "person/update", PERSON_UPDATE_CODE);uriMatcher.addURI(authority, "person/queryAll", PERSON_QUERY_ALL_CODE);uriMatcher.addURI(authority, "person/query/#", PERSON_QUERY_ITEM_CODE);}

3、完成ContentProvider未实现的方法(以insert为例):

public Uri insert(Uri uri, ContentValues values) {// 将传进来的uri进行判断是否匹配switch (uriMatcher.match(uri)) {case PERSON_INSERT_CODE:// 获得可写数据库SQLiteDatabase db = mOpenHelper.getWritableDatabase();//判断数据库是否连接if (db.isOpen()) {// 返回值为数据插入到数据库之后,所在的idlong id = db.insert("person", null, values);db.close();// 将id添加到uri末尾,并返回urireturn ContentUris.withAppendedId(uri, id);}break;default:throw new IllegalArgumentException("uri不匹配:" + uri);}return null;}

4、访问内容提供者(已inert为例):

public void testInsert() {//将一个字符串转为为uriUri uri = Uri.parse("content://com.example.SQLiteDemo.Providers.PersonContentProvider/person/insert");// 获得内容提供者访问对象ContentResolver resolver = getContext().getContentResolver();ContentValues values = new ContentValues();values.put("name", "zhagnsansan");values.put("age", 88);//通过内容提供者访问对象,调用inset方法uri = resolver.insert(uri, values);Log.i(tag, "uri:" + uri);long id = ContentUris.parseId(uri);Log.i(tag, "添加到第几行:" + id);}



ContentProvider源码:

package com.example.SQLiteDemo.Providers;import com.example.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 PersonContentProvider extends ContentProvider {private static UriMatcher uriMatcher;private static final String authority = "com.example.SQLiteDemo.Providers.PersonContentProvider";private static final int PERSON_INSERT_CODE = 0;private static final int PERSON_DELETE_CODE = 1;private static final int PERSON_UPDATE_CODE = 2;private static final int PERSON_QUERY_ALL_CODE = 3;private static final int PERSON_QUERY_ITEM_CODE = 4;private PersonSqliteOpenHelper mOpenHelper;static {uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(UriMatcher.NO_MATCH的值为-1)//如果match()方法匹配content://com.example.SQLiteDemo.Providers.PersonContentProvider/person/insert路径,返回匹配码为PERSON_INSERT_CODE,也就是0.uriMatcher.addURI(authority, "person/insert", PERSON_INSERT_CODE);uriMatcher.addURI(authority, "person/delete", PERSON_DELETE_CODE);uriMatcher.addURI(authority, "person/update", PERSON_UPDATE_CODE);uriMatcher.addURI(authority, "person/queryAll", PERSON_QUERY_ALL_CODE);uriMatcher.addURI(authority, "person/query/#", PERSON_QUERY_ITEM_CODE);}@Overridepublic boolean onCreate() {// TODO Auto-generated method stubmOpenHelper = new PersonSqliteOpenHelper(getContext());return false;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {// TODO Auto-generated method stubSQLiteDatabase db = mOpenHelper.getReadableDatabase();switch (uriMatcher.match(uri)) {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, null);return cursor;}break;default:throw new IllegalArgumentException("uri不匹配:" + uri);}return null;}@Overridepublic String getType(Uri uri) {// TODO Auto-generated method stubreturn null;}@Overridepublic Uri insert(Uri uri, ContentValues values) {// 将传进来的uri进行判断是否匹配switch (uriMatcher.match(uri)) {case PERSON_INSERT_CODE:// 获得可写数据库SQLiteDatabase db = mOpenHelper.getWritableDatabase();//判断数据库是否连接if (db.isOpen()) {// 返回值为数据插入到数据库之后,所在的idlong id = db.insert("person", null, values);db.close();// 将id添加到uri末尾,并返回urireturn ContentUris.withAppendedId(uri, id);}break;default:throw new IllegalArgumentException("uri不匹配:" + uri);}return null;}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {// TODO Auto-generated method stubswitch (uriMatcher.match(uri)) {case PERSON_DELETE_CODE:SQLiteDatabase db = mOpenHelper.getWritableDatabase();if (db.isOpen()) {int count = db.delete("person", selection, selectionArgs);db.close();return count;}break;default:throw new IllegalArgumentException("uri不匹配:" + uri);}return 0;}@Overridepublic int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {// TODO Auto-generated method stubswitch (uriMatcher.match(uri)) {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;}}

ContentResolver源码:

package com.example.othercontentprovider;import android.content.ContentResolver;import android.content.ContentUris;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.test.AndroidTestCase;import android.util.Log;public class TestCase extends AndroidTestCase {private static final String tag = "TestCase";// private ContentResolver resolver = getContext().getContentResolver();public void testInsert() {//将一个字符串转为为uriUri uri = Uri.parse("content://com.example.SQLiteDemo.Providers.PersonContentProvider/person/insert");// 获得内容提供者访问对象ContentResolver resolver = getContext().getContentResolver();ContentValues values = new ContentValues();values.put("name", "zhagnsansan");values.put("age", 88);//通过内容提供者访问对象,调用inset方法uri = resolver.insert(uri, values);Log.i(tag, "uri:" + uri);long id = ContentUris.parseId(uri);Log.i(tag, "添加到第几行:" + id);}public void testdelete() {Uri uri = Uri.parse("content://com.example.SQLiteDemo.Providers.PersonContentProvider/person/delete");ContentResolver resolver = getContext().getContentResolver();int count = resolver.delete(uri, "_id=?", new String[] { "16" });Log.i(tag, "删除了几行:" + count);}public void testupdate() {Uri uri = Uri.parse("content://com.example.SQLiteDemo.Providers.PersonContentProvider/person/update");ContentResolver resolver = getContext().getContentResolver();ContentValues values = new ContentValues();values.put("name", "lisi");resolver.update(uri, values, "_id=?", new String[] { "10" });}public void testQueryAll() {Uri uri = Uri.parse("content://com.example.SQLiteDemo.Providers.PersonContentProvider/person/queryAll");ContentResolver resolver = getContext().getContentResolver();Cursor cursor = resolver.query(uri, new String[] { "_id", "name", "age" }, null, null, null);if (cursor != null && cursor.getCount() > 0) {int id;String name;int age;while (cursor.moveToNext()) {id = cursor.getInt(0);name = cursor.getString(1);age = cursor.getInt(2);Log.i(tag, "id=" + id + "name=" + name + "age=" + age);}cursor.close();}}public void testQueryItem() {Uri uri = Uri.parse("content://com.example.SQLiteDemo.Providers.PersonContentProvider/person/query/#");// String id = "10";uri = ContentUris.withAppendedId(uri, 10);ContentResolver resolver = getContext().getContentResolver();Cursor cursor = resolver.query(uri, new String[] { "_id", "name", "age" }, null, null, null);if (cursor.moveToFirst()) {int count = cursor.getInt(0);String name = cursor.getString(1);int age = cursor.getInt(2);Log.i(tag, "_id=" + count + "name=" + name + "age=" + age);}}}



0 0
原创粉丝点击