Android學習十九:ContentProvider初步

  一、Content Provider基本概念

  1、ContentProvider爲存儲和獲取數據提供了統一的接口。ContentProvide對數據進行封裝,不用關心數據存儲的細節。使用表的形式來組織數據。

  

[轉載]Android學習十九:ContentProvider初步

  2、使用ContentProvider可以在不同的應用程序之間共享數據。

  3、Android爲常見的一些數據提供了默認的ContentProvider(包括音頻、視頻、圖片和通訊錄等)。

  ContentProvider所提供的函數:

  query(),insert(),update(),delete(),getType(),onCreate()等。

  二、URI(統一資源標識符)的使用方法

  爲系統的每一個資源給其一個名字,比方說通話記錄。

  1、每一個ContentProvider都擁有一個公共的URI,這個URI用於表示這個ContentProvider所提供的數據。

  2、Android所提供的ContentProvider都存放在android.provider包中。 將其分爲A,B,C,D 4個部分:

  

[轉載]Android學習十九:ContentProvider初步

  A:標準前綴,用來說明一個Content Provider控制這些數據,無法改變的;"content://"

  B:URI 的標識,它定義了是哪個Content Provider提供這些數據。對於第三方應用程序,爲了保證URI標識的唯一性,它必須是一個完整的、小寫的 類名。這個標識在 元素的 authorities屬性中說明:一般是定義該ContentProvider的包.類的名稱;"content://hx.android.text.myprovider"

  C:路徑,不知道是不是路徑,通俗的講就是你要操作的數據庫中表的名字,或者你也可以自己定義,記得在使用的時候保持一致就ok了;"content://hx.android.text.myprovider/tablename"

  D:如果URI中包含表示需要獲取的記錄的ID;則就返回該id對應的數據,如果沒有ID,就表示返回全部;"content://hx.android.text.myprovider/tablename/#" #表示數據id

  三、ContentProvider的實現過程

  自己實現ContentProvider不常見,因爲可能不需要和別的應用程序交換數據。使用內置的ContentProvider比較多。

  1、定義一個CONTENT_URI常量,提供了訪問ContentProvider的標識符。

  public static final Uri CONTENT_URI =Uri.parse("content://com.example.codelab.transportationprovider");

  其中:content是協議

  Com.exmaple.codelab.transportationprovider是類名,包含完整的包名。

  Uri.parse將一個字符串轉換成Uri類型。

  如果Provider包含子表,同樣定義包含字表的CONTENT_URI。

  content://com.example.codelab.transportationprovider/train

  content://com.example.codelab.transportationprovider/air/domestic

  content://com.example.codelab.transportationprovider/air/international

  然後定義列,確保裏面包含一個_id的列。

  2、定義一個類,繼承ContentProvider。

  public class FirstContentProvider extends ContentProvider

  先介紹一下ContentProvider用到的UriMatcher。UriMatcher的一個重要的函數是match(Uri uri)。這個函數可以匹配Uri,根據傳入的不同Uri返回不同的自定義整形值,以表明Uri訪問的不同資源的類型。

  例如:

  public static final UriMatcher uriMatcher;

  static {

  uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

  uriMatcher.addURI(Book.AUTHORITY, "item", Book.ITEM);

  uriMatcher.addURI(Book.AUTHORITY, "item/#", Book.ITEM_ID);

  }

  這裏UriMatcher類型的靜態字段是用來匹配傳入到ContentProvider中的Uri的類。其構造方法傳入的匹配碼是使用match()方法匹配根路徑時返回的值,這個匹配碼可以爲一個大於零的數表示匹配根路徑或傳入-1,即常量UriMatcher.NO_MATCH表示不匹配根路徑。 addURI()方法是用來增加其他URI匹配路徑的,第一個參數傳入標識ContentProvider的AUTHORITY字符串。第二個參數傳入需要匹配的路徑,這裏的#號爲通配符,代表匹配任意數字,另外還可以用*來匹配任意文本。第三個參數必須傳入一個大於零的匹配碼,用於match()方法對相匹配的URI返回相對應的匹配碼。 例如:sMatcher.addURI(“com.test.provider.personprovider”, “person”, 1);如果match()方法匹配content://com.test.provider.personprovider/person路徑,返回匹配碼爲1。

  3、實現query,insert,update,delete,getType和onCreate方法。

  4、在AndroidManifest.xml當中進行聲明。

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章