ContentProvider跨程式資料共享

2021-07-31 15:28:39 字數 3174 閱讀 2726

內容提供器(content provider)主要用於在不同的應用程式之間實現資料共享的功能.

android系統中自帶的**簿、簡訊、**庫等程式都提供了類似的訪問介面,這就使得第三方應用程式可以充分地利用這部分資料來實現更好的功能。

通過 context 中的 getcontentresolver()方法獲取到該類的例項。

contentresolver中的增刪改查方法都是不接收表名引數的,而是使用乙個 uri引數代替,這個引數被稱為內容 uri。

有了uri物件我們就可以操作了:

getcontentresolver().delete(uri, 「column2 = ?」, new string );

建立自己的內容提供器

1.繼承 contentprovider的方式來建立乙個自己的內容提供器。

contentprovider類中有六個抽象方法,

public class mycontentprovider extends contentprovider 

@override

public cursor query(uri uri, string projection, string selection,

string selectionargs, string sortorder)

@override

public string gettype(uri uri)

@override

public uri insert(uri uri, contentvalues values)

@override

public int delete(uri uri, string selection, string selectionargs)

@override

public int update(uri uri, contentvalues values, string selection,

string selectionargs)

}

oncreate()

初始化內容提供器的時候呼叫。通常會在這裡完成對資料庫的建立和公升級等操作,返回 true 表示內容提供器初始化成功,返回 false 則表示失敗。注意,只有當存在contentresolver嘗試訪問我們程式中的資料時,內容提供器才會被初始化。

query()

從內容提供器中查詢資料。使用 uri引數來確定查詢哪張表,projection 引數用於確定查詢哪些列,selection 和 selectionargs引數用於約束查詢哪些行,sortorder引數用於對結果進行排序,查詢的結果存放在 cursor物件中返回。

insert()

向內容提供器中新增一條資料。使用 uri引數來確定要新增到的表,待新增的資料儲存在 values 引數中。新增完成後,返回乙個用於表示這條新記錄的 uri。

update()

更新內容提供器中已有的資料。使用 uri引數來確定更新哪一張表中的資料,新資料儲存在 values 引數中,selection 和 selectionargs引數用於約束更新哪些行,受影響的行數將作為返回值返回。

delete()

從內容提供器中刪除資料。使用 uri 引數來確定刪除哪一張表中的資料,selection和 selectionargs引數用於約束刪除哪些行,被刪除的行數將作為返回值返回。

gettype()

根據傳入的內容 uri 來返回相應的 mime 型別。

mime字串主要由三部分組分,android對這三個部分做了如下格式規定。

1. 必須以 vnd 開頭。

2. 如果內容 uri 以路徑結尾,則後接 android.cursor.dir/,如果內容 uri 以 id 結尾,則後接 android.cursor.item/。

3. 最後接上 vnd..。

可以看到, 幾乎每乙個方法都會帶有 uri這個引數, 這個引數也正是呼叫 contentresolver

的增刪改查方法時傳遞過來的。乙個標準的內容 uri寫法是這樣的:

除此之外,我們還可以在這個內容 uri的後面加上乙個 id

我們可以使用萬用字元的方式來分別匹

配這兩種格式的內容 uri,規則如下。

1. *:表示匹配任意長度的任意字元

2. #:表示匹配任意長度的數字

再借助urimatcher這個類就可以輕鬆地實現匹配內容uri的功能。 urimatcher中提供了乙個 adduri()方法,這個方法接收三個引數,可以分別把許可權、路徑和乙個自定義**傳進去。這樣,當呼叫 urimatcher 的 match()方法時,就可以將乙個 uri 物件傳入,返回值是某個能夠匹配這個 uri 物件所對應的自定義**,利用這個**,我們就可以判斷出呼叫方期望訪問的是哪張表中的資料了

public class myprovider extends contentprovider 

.....

再利用urimatcher.match()的返回值判斷期望訪問的是哪張表中的資料。

public cursor query(uri uri, string projection, string selection,

string selectionargs, string sortorder)

……}

最後別忘了給contentprovider註冊:

接下來就可以在別的程式裡面通過getcontentresolver()獲得例項就可以運算元據了。

如何新增Content Provider

一 寫在前面 一直很好奇系統是如何通過 content 來訪問歸屬地資料庫的,通過研究 和api參考文件以及網路上的資料基本上弄明白了,於是有了以下的內容。二 android content provider介紹 三 content provider的組成 四 新增content provider ...

ContentProvider基本使用

在不同應用之間實現資料共享,並保證安全性 比較 新增 沒有條件約束,刪除 沒有資料contentvalues getcontentresolver insert uri uri,contentvalues values getcontentresolver update uri uri,conten...

ContentProvider簡單使用

一是使用內容提供器讀取和操作其他應用程式的資料 二是建立內容提供器給該程式的資料提供外部訪問介面 如 簿,簡訊,庫,都有內容提供器讓它們的資料有外部訪問介面 內容提供器提供的資料外部訪問介面是乙個uri.它由authority和path組成 path相當於不同的表加在authority的後面。如有表...