在前面调用系统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>