自定义ContentProvider

在前面调用系统ContentProvider实现了管理联系人和多媒体内容,而有的时候,我们需要自己定义ContentProvider供别人使用,下面我们实现一个简单的自定义ContentProvider,实现对数据库的增、删、改、查功能,为了方便阅读,数据仍是手动写死的,实际中应该根据业务需求从其他地方动态获取,代码如下:

主界面:

package com.lovo.studentmanagesystem;

import com.lovo.provider.Student;

import android.app.Activity;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class ContentProviderTest extends Activity {
	private TextView show;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.content_provider);
		show = (TextView) findViewById(R.id.content_provider_tv_show);
	}

	public void click(View v) {
		ContentValues values = new ContentValues();
		if (v.getId() == R.id.content_provider_btn_add) {
			// 根据指定学生信息添加学生
			values.put(Student.Data.NAME, "张无忌");
			values.put(Student.Data.AGE, 23);
			values.put(Student.Data.SEX, "男");
			getContentResolver().insert(Student.Data.CONTENT_URI, values);
		} else if (v.getId() == R.id.content_provider_btn_del) {
			// 根据指定ID删除学生
			Uri uri = ContentUris.withAppendedId(Student.Data.CONTENT_URI, 3);
			getContentResolver().delete(uri, null, null);
		} else if (v.getId() == R.id.content_provider_btn_update) {
			// 根据指定ID修改学生信息
			Uri uri = ContentUris.withAppendedId(Student.Data.CONTENT_URI, 1);
			values.put(Student.Data.NAME, "元芳");
			values.put(Student.Data.AGE, 28);
			values.put(Student.Data.SEX, "男");
			getContentResolver().update(uri, values, null, null);
		} else if (v.getId() == R.id.content_provider_btn_find) {
			// 查询所有学生信息
			Cursor cursor = this.getContentResolver().query(
					Student.Data.CONTENT_URI, null, null, null, null);
			// 根据指定ID查询学生信息
			// Uri uri = ContentUris.withAppendedId(Student.Data.CONTENT_URI,
			// 1);
			// Cursor cursor = this.getContentResolver().query(uri, null, null,
			// null, null);
			StringBuffer sb = new StringBuffer();
			while (cursor.moveToNext()) {
				int id = cursor.getInt(cursor.getColumnIndex(Student.Data._ID));
				String name = cursor.getString(cursor
						.getColumnIndex(Student.Data.NAME));
				String sex = cursor.getString(cursor
						.getColumnIndex(Student.Data.SEX));
				int age = cursor
						.getInt(cursor.getColumnIndex(Student.Data.AGE));
				sb.append("此学生ID是:" + id + "  " + "姓名是:" + name + "  " + "性别是:"
						+ sex + "  " + "年龄是:" + age + "
");
			}
			show.setText(sb.toString());
		}
	}
}

由于主界面的布局很简单就几个按钮和一个显示文本框,故在此就省略不写了。
自定义的ContentProvider类:

package com.lovo.provider;

import com.lovo.dao.DBUtil;

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 StudentContentProvider extends ContentProvider {
	private UriMatcher uriMatcher;
	private SQLiteDatabase db;

	@Override
	public boolean onCreate() {
		// 创建注册Uri的工具类
		uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		uriMatcher.addURI(
				"com.lovo.studentmanagesystem.StudentContentProvider",
				"student", 1);
		// 任何uri后面有内容的都会被注册成标示2。比如content://com.lovo.studentmanagesystem/student/1
		uriMatcher.addURI(
				"com.lovo.studentmanagesystem.StudentContentProvider",
				"student/#", 2);
		db = DBUtil.getInstance(this.getContext());
		return true;
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		long id = db.insert("t_stu", null, values);
		// 将id附加到Uri后面
		if (id >= 0) {
			uri = ContentUris.withAppendedId(uri, id);
			return uri;
		}
		return null;
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		int row = 0;
		// 解析传过来的uri
		switch (uriMatcher.match(uri)) {
		case 1:
			row = db.delete("t_stu", selection, selectionArgs);
			break;
		case 2:
			long id = ContentUris.parseId(uri);
			if (selection == null) {
				selection = Student.Data._ID + "=" + id;
			} else {
				selection = selection + " and " + Student.Data._ID + "=" + id;
			}
			row = db.delete("t_stu", selection, selectionArgs);
			break;
		default:
			break;
		}
		return row;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		int row = 0;
		// 解析传过来的uri
		switch (uriMatcher.match(uri)) {
		case 1:
			row = db.update("t_stu", values, selection, selectionArgs);
			break;
		case 2:
			long id = ContentUris.parseId(uri);
			if (selection == null) {
				selection = Student.Data._ID + "=" + id;
			} else {
				selection = selection + " and " + Student.Data._ID + "=" + id;
			}
			row = db.update("t_stu", values, selection, selectionArgs);
			break;
		default:
			break;
		}
		return row;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		Cursor cursor = null;
		// 解析传过来的uri
		switch (uriMatcher.match(uri)) {
		case 1:
			cursor = db.query("t_stu", projection, selection, selectionArgs,
					null, null, sortOrder);
			break;
		case 2:
			// 从uri中获取id
			long id = ContentUris.parseId(uri);
			if (selection == null) {
				selection = "_id=" + id;
			} else {
				selection = selection + " and _id=" + id;
			}
			cursor = db.query("t_stu", projection, selection, selectionArgs,
					null, null, sortOrder);
			break;
		default:
			break;
		}
		return cursor;
	}

	@Override
	public String getType(Uri uri) {
		return null;
	}

}


专门定义常量的类:

package com.lovo.provider;

import android.net.Uri;
import android.provider.BaseColumns;

/**
 * 定义和Student相关的常量值
 * 
 * @author Administrator
 * 
 */
public class Student {
	public static final String AUTHORITY = "com.lovo.studentmanagesystem.StudentContentProvider";

	public static final class Data implements BaseColumns {
		public static final String NAME = "s_userName";
		public static final String AGE = "s_age";
		public static final String SEX = "s_sex";
		public static final Uri CONTENT_URI = Uri.parse("content://"
				+ AUTHORITY + "/student");
	}
}

SQLiteOpenHelper的子类DBUtil:

package com.lovo.dao;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class DBUtil extends SQLiteOpenHelper {
	private static DBUtil dbUtil;

	private DBUtil(Context context, String name, CursorFactory factory,
			int version) {
		super(context, name, factory, version);
	}

	public static SQLiteDatabase getInstance(Context context) {
		if (dbUtil == null) {
			dbUtil = new DBUtil(context, "student", null, 1);
		}
		return dbUtil.getReadableDatabase();
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		try {			
			db.execSQL("create table t_stu(_id integer primary key,s_userName text,s_age integer,s_sex text)");
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

	}

}

最后不要忘了在清单文件中配置自定义的ContentProvider:

<provider
            android:name="com.lovo.provider.StudentContentProvider"
            android:authorities="com.lovo.studentmanagesystem.StudentContentProvider" >
        </provider>




 

原文地址:https://www.cnblogs.com/xinyuyuanm/p/3177649.html