Android學習--------ContentProvider組件
1ContentProvider基本概念
(1)爲存儲和獲取數據提供了統一的接口
(2)可以在不同應用程序之間共享數據
(3)Android爲常見的一些數據提供了ContentProvider(音頻圖片 通信錄等等)
(4)ContentProvider使用表的形式來組織數據
(6)ContentProvider所提供的函數:
query insert update delete getType onCreate
2Uri 統一資源標識符
每個ContentProvider都擁有一個公共的URI,用於表示這個ContentProvider所提供的數據,並且就是通過這個URI來操作ContentProvider所提供的數據;
Android所提供的ContentProvider都存放在android.provider包中
Uri代表了要操作的數據,Uri主要包含了兩部分信息:1.需要操作的ContentProvider,2.對ContentProvider中的什麼數據進行操作,一個Uri由以下幾部分組成:
(1).scheme:ContentProvider(內容提供者)的scheme已經由Android所規定爲: content://。
(2).主機名(或Authority):用於唯一標識這個ContentProvider,外部調用者可以根據這個標識來找到它。
(3).路徑(path):可以用來表示我們要操作的數據,路徑的構建應根據業務而定,如下:
要操作contact表中id爲10的記錄,可以構建這樣的路徑:/contact/10
要操作contact表中id爲10的記錄的name字段,contact/10/name
要操作contact表中的所有記錄,可以構建這樣的路徑:/contact
要操作的數據不一定來自數據庫,也可以是文件等他存儲方式
3ContentProvider的實現方法:
(自己實現一個並不常見使用內置較多)
(1)定義一個CONTENT_URI常量
publicstaticfinalUri CONTENT_URI= Uri.parse("content://"+ AUTHORIY+ "/users");;一般用類名
定義常量列名 必須有_ID(INTEGERPRIMARY KEY AUTOINCREMENT 如果使用sqllite3的話t ype)(_ID這個常量是BaseColumns中已定義好的)
數據類型通過CONTENT_TYPE和CONTENT_TYPE_ITEM確定
CONTENT_TYPE= "vnd.android.cursor.dir/vnd.firstprovider.user";
CONTENT_TYPE_ITEM= "vnd.android.cursor.item/vnd.firstprovider.user";
表的結構可以通過implementBaseColumns來達到目的
(2)定義一個類,繼承ContentProvider
UriMatcher用於匹配URI
uriMatcher.addURI("AUTHORITY變量","路徑/#(id)",匹配常量)
userProjectionMap一個<String,String>的HashMap
userProjectionMap.put(列名,列名的別名)
(3)實現query insert update deleteonCreate getType等方法
(3.1)getType方法根據傳入的URI 返回該URI所表示的數據類型
eg:
switch(uriMatcher.match(uri)){
case匹配常量1:
return數據類型(CONTENT_TYPE)
case匹配常量2:
return數據類型2(CONTENT_TYPE_ITEM)
}
(3.2)實現insert(Uriuri,ContentValue values)方法
eg:
通過SQLiteDatabase操作
返回值爲代表剛剛插入數據的Uri
(3.3)實現query方法
eg:
用到SQLiteQueryBuiler對象
qb.setTables(表名)
qb.setProjectionMap(之前創建的HashMap別名彪)
對單條qb.appendWhere()
(3.4)在AndroidManifest.xml中聲明
<providerandroid:name="包名+類名"
android:authorities="包名+類名"/> 這裏的authorities一定要與定義的常量一致
(3.5)使用自定義ContentProvider
newContentValues()存放要存入的值
uri=getContentResolver().insert(要插入的uri,contentValues)
Cursorc =getContentResolver().query(要查尋的uri,projection,selection,selectionArgs,sortOrder)
getContext()獲取當前運行的provider的上下文
4.UriMatcher、ContentUrist和ContentResolver簡介
因爲Uri代表了要操作的數據,所以我們很經常需要解析Uri,並從Uri中獲取數據。Android系統提供了兩個用於操作Uri的工具類,分別爲UriMatcher和ContentUris。掌握它 們的使用,會便於我們的開發工作。
(1)UriMatcher:用於匹配Uri,它的用法如下:
(1.1).首先把你需要匹配Uri路徑全部給註冊上,如下:
//常量UriMatcher.NO_MATCH表示不匹配任何路徑的返回碼(-1)。
UriMatcheruriMatcher = newUriMatcher(UriMatcher.NO_MATCH);
//如果match()方法匹配content://com.changcheng.sqlite.provider.contactprovider/contact路 徑,返回匹配碼爲1
uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”,“contact”,1);//添加 需要匹配uri,如果匹配就會返回匹配碼
//如果match()方法匹配 content://com.changcheng.sqlite.provider.contactprovider/contact/230路徑,返回匹配碼爲2
uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”,“contact/#”,2);//#號 爲通配符
(1.2).註冊完需要匹配的Uri後,就可以使用uriMatcher.match(uri)方法對輸入的Uri進行匹配,如果匹配就返回匹配碼,匹配碼是調用addURI()方法傳入的第三個參數,假設匹配 content://com.changcheng.sqlite.provider.contactprovider/contact路徑,返回的匹配碼爲1
(2)ContentUris:用於獲取Uri路徑後面的ID部分,它有兩個比較實用的方法:
withAppendedId(uri,id)用於爲路徑加上ID部分(因爲db.insert操作是沒有添加id的)
parseId(uri)方法用於從路徑中獲取ID部分
(3)ContentResolver:當外部應用需要對ContentProvider中的數據進行添加、刪除、修改和查詢操作時,可以使用ContentResolver類來完成,要獲取ContentResolver對象,可以使用 Activity提供的getContentResolver()方法。ContentResolver使用insert、delete、query、
update方法,來操作數據;notifyChange用於通知註冊的觀察對象這一行已更新。