Android学习笔记--Content Provider 2

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";
// 访问该ContentProvider的URI
Public static final Uri CONTENG_URI = Uri.parse("content://" + AUTHORY + "/users");
// 整张表的数据类型是 vnd.android.cursor.dir/vnd + name;
Public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.FinrstContentProvider.ser";
// 单条数据类型定义 vnd.android.cursor.item/vnd + name
Public static final String CONTENT_TYPE_ITEM = "vnd.android.cursor.item/vnd.FinrstContentProvider.user";
// 列名
Public static final String USER_NAME = "name";
// 默认排序方法
Public static final String DEFAULT_SORT_ORDER = "_id desc";
}
}



最后在 androidMnaifest.xml 中注册 provider 与Activity同级  authorities中的数据一定要与CONTENG_URI的一致
<provider android:name="com.android.FirstContentProvider "
Android:authorities="com.android.FirstContentProvider " />

你可能感兴趣的:(Android学习笔记--Content Provider 2)