Android中建立本身的ContentProvider

是如何實現應用程序之間數據共享的?咱們之前談到外界的程序能夠經過ContentResolver接口訪問ContentProvider提供的數據,今天咱們來談下如何建立本身的ContentProvider來實現應用程序之間的數據共享。php

  1. 一個應用程序能夠建立本身的數據,這個數據對該應用程序來講是私有的,外界更本看不到,也不知道數據是如何 存儲的,或者是使用數據庫仍是使用文件,仍是經過網上得到,這些一切都不重要,重要的是外界能夠經過這一套標準及統一的接口和這個程序裏的數據打交道,例 如:添加(insert)、刪除(delete)、查詢(query)、修改(update)。android

Android爲咱們提供了ContentProvider來實現數據的共享,一個程序若是想讓別的程序能夠操做本身的數據,就定義本身的 ContentProvider,而後在AndroidManifest.xml中註冊,其餘application能夠經過獲取 ContentResolver經過Uri來操做上一程序的數據。sql

Android中的電話本等數據就是經過ContentProvider實現數據共享的,系統中有不少已經存在的共享Uri。咱們可使用ContentResolver經過Uri來操做不一樣表的數據;如Contacts.People.CONTENT_URI數據庫

什麼是URI?app

將其分爲A,B,C,D 4個部分:ide

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

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

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

D:若是URI中包含表示須要獲取的記錄的ID;則就返回該id對應的數據,若是沒有ID,就表示返回所有; "content://hx.android.text.myprovider/tablename/#" #表示數據idsqlite

這裏主要是說明如何建立本身的ContentProvider,這裏有幾個經常使用的類

UriMatcher:用於匹配Uri,它的用法以下:

1.首先把你須要匹配Uri路徑所有給註冊上,以下: //常量UriMatcher.NO_MATCH表示不匹配任何路徑的返回碼(-1)。 UriMatcher uriMatcher = new UriMatcher(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);//#號爲通配符

2.註冊完須要匹配的Uri後,就可使用uriMatcher.match(uri)方法對輸入的Uri進行匹配,若是匹配就返回匹配碼,匹配碼是調用 addURI()方法傳入的第三個參數,假設匹配 content://com.changcheng.sqlite.provider.contactprovider/contact路徑,返回的匹配碼爲1。

ContentUris:用於獲取Uri路徑後面的ID部分,它有兩個比較實用的方法:

· withAppendedId(uri, id)用於爲路徑加上ID部分
· parseId(uri)方法用於從路徑中獲取ID部分

其餘要用到的類程序中已添加說明本身寫了一個小的測試程序,附在下面有想了解的能夠看一下程序是基於同一個application的。

對應自定義ContentProvider的使用找到如下資料:
Android開發中的ContentProvider數據模型概述
Android中ContentProvider和ContentResolver使用入門

ContentProvider是何時建立的,是誰建立的?訪問某個應用程序共享的數據,是否須要啓動這個應用程序?這個問題在 Android SDK中沒有明確說明,可是從數據共享的角度出發,ContentProvider應該是Android在系統啓動時就建立了,不然就談不上數據共享了。 這就要求在AndroidManifest.XML中使用元素明肯定義。 可能會有多個程序同時經過ContentResolver訪問一個ContentProvider,會不會致使像數據庫那樣的「髒數 據」?這個問題一方面須要數據庫訪問的同步,尤爲是數據寫入的同步,在AndroidManifest.XML中定義ContentProvider的時 候,須要考慮是元素multiprocess屬性的值;另一方面Android在ContentResolver中提供了notifyChange() 接口,在數據改變時會通知其餘ContentObserver,這個地方應該使用了觀察者模式,在ContentResolver中應該有一些相似 register,unregister的接口。 至此,已經對ContentProvider提供了比較全面的分析,至於如何建立ContentProvider,可經過2種方法:建立一個屬於你本身的 ContentProvider或者將你的數據添加到一個已經存在的ContentProvider中,固然前提是有相同數據類型而且有寫入 Content provider的權限。

相關文章
相關標籤/搜索