一、概念及說明
ContentProvider定義:
內容提供者是一個Android應用的基礎模組,提供內容給這個應用,它們封裝資料和提供它給應用程式通過這個ContentResolver接口,使用ContentProvider可以在不同的應用程式之間共享數據,android為常見的一些數據提供了ContentProvider(視訊、音訊),ContentProvider使用表的形式來組織數據。
URI定義:
每一個ContentProvider都有一個公共的URI,這個URI用來表示這個ContentProvider所提供的資料。 android所提供ContentProvider都存放在android.provider。
二、實作ContentProvider的過程
1。定義ContentProvider所需的常數(最主要的是定義CONTENT_URI,CONTENT_URI是Uri型,事實是透過字串解析得到)
//定义ContentProvider所需要的常量 public class FirstProviderMetaData { // AUTHORIY等于自己的创建ContentProvider类的完全路径 public static final String AUTHORIY = "com.example.firstconent.FirstContentProvider"; // 数据库的名称 public static final String DATABASE_NAME = "FirstProvider.db"; // BaseColumns有两个字段_id和_count public static final class UserTableMetaData implements BaseColumns { // 表名 public static final String TABLE_NAME = "t_user"; // 访问该ContentProvider的URI public static final Uri CONTENT_URI = Uri .parse("content://" + AUTHORIY); // 表的数据类型 public static final String CONTENT_TYPE = "vnd.android.cursor.dir/users"; // 一列的数据类型 public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/users"; // 一个字段 public static final String USER_NAME = "name"; // 默认排序 public static final String DEFAULT_SORT_ORDER = "_id desc"; } }
2。定義一個類,繼承ContentProvider
3。實作query,insert,update,delete,getType和onCreate方法
(1).定義UriMatcher
// 匹配Uri,检查Uri的合法性 public static final UriMatcher uriMatcher; public static final int INCOMING_USER_COLLECTION = 1; public static final int INCOMING_USER_SIGNLE = 2; static { // 创建一个uri树的根结点 uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); // 添加uri匹配对,如果这个匹配成功,则code值则会返回。 uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/t_user", INCOMING_USER_COLLECTION); uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/t_user/#", INCOMING_USER_SIGNLE); }
(2).重寫getTypeType
Map哈希Map靜態物件// 根据传入uri,所回该uri所表示的数据类型 @Override public String getType(Uri uri) { // TODO Auto-generated method stub switch (uriMatcher.match(uri)) { case INCOMING_USER_COLLECTION: return UserTableMetaData.CONTENT_TYPE; case INCOMING_USER_SIGNLE: return UserTableMetaData.CONTENT_ITEM_TYPE; default: throw new IllegalArgumentException("Unknown URI" + uri); } }
public static HashMap<String, String> userProjectMap; static { userProjectMap = new HashMap<String, String>(); userProjectMap.put(UserTableMetaData._ID, UserTableMetaData._ID); userProjectMap.put(UserTableMetaData.USER_NAME, UserTableMetaData.USER_NAME); }
(5).重寫寫法。在AndroidManifest.xml中聲明
// 该方法返回值是一个uri,这个uri表示的刚刚使用这个方法所插入的数据 @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub SQLiteDatabase db = dbHelper.getWritableDatabase(); // rowId是新插入数据的id long rowId = db.insert(UserTableMetaData.TABLE_NAME, null, values); // 正常插入,-1为出常错误 if (rowId != -1) { // 添加一个id到这个路径的结尾 Uri insertUserUri = ContentUris.withAppendedId( UserTableMetaData.CONTENT_URI, rowId); // 得到一个ContentResolver实例. ContentResolver cr = this.getContext().getContentResolver(); // 通辞呈数据改变 cr.notifyChange(insertUserUri, null); return insertUserUri; } else { throw new SQLException("Failed to insert row into" + uri); } }
感謝閱讀,希望能幫助大家,謝謝大家對本站的支持!
更多Android ContentProvider的實作及簡單實例代碼相關文章請關注PHP中文網!