Android學習--ContentProvider

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.需要操作的ContentProvider2.ContentProvider中的什麼數據進行操作,一個Uri由以下幾部分組成:
	1.schemeContentProvider(內容提供者)的scheme已經由Android所規定爲:	content://
	2.主機名(或Authority):用於唯一標識這個ContentProvider,外部調用者可以根據這個標識來找到它。
	3.路徑(path):可以用來表示我們要操作的數據,路徑的構建應根據業務而定,如下:
	要操作contact表中id10的記錄,可以構建這樣的路徑:/contact/10
	要操作contact表中id10的記錄的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_TYPECONTENT_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.1getType方法根據傳入的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.UriMatcherContentUristContentResolver簡介
      因爲Uri代表了要操作的數據,所以我們很經常需要解析Uri,並從Uri中獲取數據。Android系統提供了兩個用於操作Uri的工具類,分別爲UriMatcherContentUris。掌握它	們的使用,會便於我們的開發工作。
	1UriMatcher:用於匹配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

	2ContentUris:用於獲取Uri路徑後面的ID部分,它有兩個比較實用的方法:
	withAppendedId(uri,id)用於爲路徑加上ID部分(因爲db.insert操作是沒有添加id的)
	parseId(uri)方法用於從路徑中獲取ID部分

	3ContentResolver:當外部應用需要對ContentProvider中的數據進行添加、刪除、修改和查詢操作時,可以使用ContentResolver類來完成,要獲取ContentResolver對象,可以使用	Activity提供的getContentResolver()方法。ContentResolver使用insertdeletequery
	update方法,來操作數據;notifyChange用於通知註冊的觀察對象這一行已更新。

發佈了15 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章