在前面调用系统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 + "\n"); } 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>