FirstContentProvider 继承 ContentProvider 例 :

Public class FirstContentProvider extends ContentProvider {

Public static final UriMatcher uriMatcher;
Public static final int INCOMING_USER_COLLECTION = 1;
Public static final int INCOMING_USER_SINGLE = 2;
Private DatabaseHelper  dh;

Static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
// URI限定名的添加验证  定义了一个验证的规则
uriMatcher.addURI(FirstMetaData.AUTHORTY , "/users", INCOMING_USER_COLLECTION);
uriMatcher.addURI(FirstMetaData.AUTHORTY , "/users/#", INCOMING_USER_SINGLE);
}

Public static HashMap<String,String> userProjectionMap;
Static
{
userProjectionMap = new HashMap<String,String>();
// ._ID 就是baseColumns实现的结果
userProjectionMap.put(FirstMetaData._ID , FirstMetaData._ID);
userProjectionMap.put(FirstMetaData .USER_NAME , FirstMetaData .USER_NAME);
}

@Override
Public int delete(Uri arg0 , String arg1 , String[] arg2) {
System.out.println("delete");
Return 0;
}

// 根据传入的Uri,返回该Uri所表示的数据类型
@Override
Public String getType(Uri uri) {
System.out.println("getType");
Switch (uriMatcher.match(uri)) {
Case INCOMING_USER_COLLECTION:
Return FirstMetaData.CONTENT_TYPE;
Case INCOMING_USER_SINGLE:
Return FirstMetaData.CONTENT_TYPE_ITEM;
Default:
Throw new IllegalArgumentExecption("Unknown URI" + uri);
}
}

// 该函数的返回值是一个Uri , 这个URi表示的是刚刚使用这个函数所插入的数据
// content://com.android.FirstContentProvider/users/1
@Override
Public Uri insert(Uri uri , ContentValue values) {
System.out.println("insert");
SQLiteDatabase db = dh.getWrittableDatabase();
Long rowId = db.insert(FirstMetaData.TABLE_NAME , null , values);
If(rowId > 0) {
// 以Content起头的Uri都可以用ContentUris来处理
Uri insertedUserUri = ContentUris.withAppendedId(UserTableMetaData.CONTENT_URI , rowId);
// 通知监听器 , 数据已经改变
getContext().getContentResolver().notifyChange(insertedUserUri , null);
Return insertedUserUri;
}
Throw new SQLExecption("Failed to insert row into " + uri);
}

@Override
Public boolean onCreate() {
Dh = new DatabaseHelper(getContext() , FirstMetaData.DATABASE_NAME);
System.out.println("onCreate");
Return true;
}

@Override
Public Cursor query(Uri uri , String[] projection , String selection , String[] selectionArgs , String sortOrder) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder ();
Switch (uriMatcher.match(uri)) {
Case INCOMING_USER_COLLECTION:
qb.setTables(FirstMetaData.TABLE_NAME);
qb.setProjectionMap(userProjectionMap);
Break;
Case INCOMING_USER_SINGLE:
qb.setTables(FirstMetaData.TABLE_NAME);
qb.setProjectionMap(userProjectionMap);
// 取回了单条数据 list
qb.appendWhere(FirstMetaData._ID  +  "=" + uri.getPathSeqments().get(1));
Break;
}
String orderBy;
If (TextUtils.isEmpty(sortOrder)) {
orderBy = FirstMetaData.DEFAULT_SORT_ORDER;
} else {
orderBy = sortOrder;
}
SQLiteDatabase db = dh.getWritableDatabase();
Cursor c = qb.query(db , projection , selection , selectionArgs , null , null , orderBy);
c.setNotificationUri ( getContext().getContentResolver() , uri);
System.out.println("query");
Return c;
}

@Override
Public int update(Uri arg0 , ContentValues arg1 , String arg2 , String[] arg3)  {
System.out.println("update");
}
}

  
  

FirstMetaData (一些静态常量例 :

Public class FirstMetaData {
// URI限定名的名称   包名 类名
Public static final String AUTHORTY = "com.android.FirstContentProvider";
// 数据库名称
Public static final String DATABASE_NAME = "FirstContentProvider.db";
// 数据库版本
Public static final int DATABASE_VERSION = 1;
// 表名
Public static final Strint USERS_TABLE_NAME = "users";

// BaseColumns 实现了表的_id
Public static final class UserTableMetaData implements BaseColumns {
// 表名
Public static final String TABLE_NAME = "users";
// 访问该ContentProviderURI
Public static final Uri CONTENG_URI = Uri.parse("content://" + AUTHORY + "/users");
// 整张表的数据类型是