1、MyProvider.java是自定义的provider类
---------------------
package com.test.liu.provider;
import java.util.concurrent.CountDownLatch;
import java.util.regex.Matcher;
import com.test.liu.db.NoticeBoardHelper;
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 MyProvider extends ContentProvider{
//定义uri是否匹配变量,不匹配返回-1
private NoticeBoardHelper dBoardHelper;
private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
private static final int RECORD =1;
private static final int RECORDS = 2;
public static final Uri RECORD_URI = Uri.parse("content://" + "com.example.providers.recordprovider");
static {
//添加匹配内容定义,第一个参数是authority,第二个参数是:路径(表名),第三个参数是:两者相匹配时返回的匹配码
MATCHER.addURI("com.example.providers.recordprovider", "record", RECORDS);
//*号代表所有字符,#号代表数字
MATCHER.addURI("com.example.providers.recordprovider", "record/*", RECORD);
}
//返回删除条目数
//第一个参数uri,第二个是where语句条件用占位符表示,第三个参数值是个数组合第二个参数的占位符是一一对应的
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
//取得数据库操作类实例
SQLiteDatabase sqldb = dBoardHelper.getWritableDatabase();
int num = 0;
Uri _uri= null;
//匹配传过来的URI
switch(MATCHER.match(uri)){
case 1://item
num = sqldb.delete("proclamation_record", selection, selectionArgs);
break;
case 2:
// long rowid = ContentUris.parseId(uri);
// String where = "user_id=" + rowid;
// if(selection !=null && !"".equals(selection.trim())){
// where += " and " + selection;
// }
// num = sqldb.delete("proclamation_record", where, selectionArgs);
String userid = uri.getPathSegments().get(1);
num = sqldb.delete("proclamation_record", "user_id='"+userid+"'", null);
if (num > 0) {
_uri = ContentUris.withAppendedId(RECORD_URI, num);
getContext().getContentResolver().notifyChange(_uri, null);
}
break;
default:
throw new IllegalArgumentException("this is Unknow Uri:" + uri);
}
return num;
}
@Override
public String getType(Uri uri) {
//匹配传过来的Uri
switch(MATCHER.match(uri)){
case 1://如果得到的结果集是集合类型,则返回此结果
return "vnd.android.cursor.dir/record";
case 2://如果得到的结果集是非集合类型,则返回此结果
return "vnd.android.cursor.item/record";
default:
throw new IllegalArgumentException("this is Unknow Uri:" + uri);
}
}
@Override
public Uri insert(Uri uri, ContentValues values) {
//取得数据库操作类实例
SQLiteDatabase sqldb = dBoardHelper.getWritableDatabase();
switch(MATCHER.match(uri)){
case 2:
long rowid = sqldb.insert("proclamation_record", "", values);//如果主键值自增长,那么返回的是主键值
Uri insertUri = ContentUris.withAppendedId(RECORD_URI, rowid);
getContext().getContentResolver().notifyChange(insertUri, null);
//insertUri也可以用下面的方法进行组合:
// Uri inserUri = Uri.parse("content://com.example.provides.personprovider/person/");
// ContentUris.withAppendedId(insertUri, rowid);
return insertUri;
default:
throw new IllegalArgumentException("this is Unknow Uri:" + uri);
}
}
//初始化操作
@Override
public boolean onCreate() {
dBoardHelper = new NoticeBoardHelper(this.getContext());
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
//取得数据库操作类实例
SQLiteDatabase sqldb = dBoardHelper.getWritableDatabase();
Cursor cursor = null;
int num = 0;
//匹配传过来的Uri
switch(MATCHER.match(uri)){
case 1:
String sql = "select * from proclamation_record";
cursor = sqldb.rawQuery(sql, null);
break;
//return sqldb.query("record", null, selection, selectionArgs, null, null, sortOrder);
case 2:
sql = "select * from proclamation_record where user_id = "+"'"+uri.getPathSegments().get(1)+"'";
cursor = sqldb.rawQuery(sql, null);
break;
default:
throw new IllegalArgumentException("this is Unknow Uri:" + uri);
}
return cursor;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
//取得数据库操作类实例
SQLiteDatabase sqldb = dBoardHelper.getWritableDatabase();
int count = 0;
Uri _uri = null;
//匹配传过来的Uri
switch(MATCHER.match(uri)){
case 1:
count = sqldb.update("record", values, selection, selectionArgs);
if (count > 0) {
_uri = ContentUris.withAppendedId(RECORD_URI, count);
getContext().getContentResolver().notifyChange(_uri, null);
}
break;
case 2:
count = sqldb.update("proclamation_record", values, "user_id=?", new String[] { uri.getPathSegments().get(1) });
if (count > 0) {
_uri = ContentUris.withAppendedId(RECORD_URI, count);
getContext().getContentResolver().notifyChange(_uri, null);
}
break;
default:
throw new IllegalArgumentException("this is Unknow Uri:" + uri);
}
return count;
}
}
------------------------------------------------------------------------------------------------------------------------------------------------
2、NoticeBoardHelper.java:对数据库的操作类
package com.test.liu.db;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
/**
* add by sky.liu for notice board
* 这个类的作用是继承数据库的帮助类
* */
public class NoticeBoardHelper extends SQLiteOpenHelper{
public NoticeBoardHelper(Context context) {
super(context, "proclamation_record.db", null, 1);
}
//数据库第一次创建时候调用,
public void onCreate(SQLiteDatabase db) {
//db.execSQL("create table user(uid integer primary key autoincrement, uname varchar(20), uaddress varchar(20))");
String sqlStr="create table proclamation_record(" +
"id integer primary key autoincrement," +
"[user_id] varchar(32) default null," +
"[user_name] varchar(32) default null,"+
"[area_code] varchar(18) default null,"+
"[user_level] varchar(2) default null,"+
"[info_type] varchar(2) default null,"+
"[insert_time] datetime default null,"+
"[subject] varchar(128) default null,"+
"[content] varchar(255) default null,"+
"[expire_time] datetime default null,"+
"[version] integer default null,[status] integer default null);";
Log.v("sky.liu", "开始创建数据库表proclamation_record");
db.execSQL(sqlStr);
Log.v("sky.liu", "数据库表proclamation_record创建完毕");
//CREATE TABLE time([ID] INTEGER PRIMARY KEY,[IDCardNo] VARCHAR (50),[CreatedTime] TimeStamp NOT NULL DEFAULT CURRENT_TIMESTAMP);
}
//数据库文件版本号发生变化时调用
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
}
// for content provider
public void add(String userid,String username,String areacode,String userlevel,String infotype,String inserttime,String subject,String content,String expiretime,String version){
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put("user_id", userid);
values.put("user_name", username);
values.put("area_code", areacode);
values.put("user_level", userlevel);
values.put("info_type", infotype);
values.put("insert_time", inserttime);
values.put("subject", subject);
values.put("content", content);
values.put("expire_time", expiretime);
values.put("version", version);
db.insert("proclamation_record","",values);
db.close();
}
}
----------------------------------------------------------------------------------------------------------------------
3、在AndroidManifest.xml中的配置:
<provider android:name="com.test.liu.provider.MyProvider" android:authorities="com.example.providers.recordprovider" />
</application>
-----------------------------------------------------------------------------------------------------------------------
4、调用方式:
ContentResolver contentResolver = getContentResolver();
Cursor cursor =contentResolver.query(Uri.parse("content://com.channelsoft.count.sms/record/1"), null, null, null, null);
Toast.makeText(context, cursor.getString(cursor.getColumnIndex("user_name")), 5000).show();