android 內容提供器簡介

2021-09-08 03:51:01 字數 3795 閱讀 6949

我們學了 android 資料持久化的技術,包括檔案儲存、sharedpreferences 存 儲、以及資料庫儲存。不知道你有沒有發現,使用這些持久化技術所儲存的資料都只能在當 前應用程式中訪問。雖然檔案和 sharedpreferences 儲存中提供了 mode_world_readable 和 mode_world_writeable 這兩種操作模式,用於供給其他的應用程式訪問當前應用 的資料,但這兩種模式在 android 4.2 版本中都已被廢棄了。為什麼呢?因為 android 官方已 經不再推薦使用這種方式來實現跨程式資料共享的功能,而是應該使用更加安全可靠的內容 提供器技術。

可能你會有些疑惑,為什麼要將我們程式中的資料共享給其他程式呢?當然,這個要視 情況而定的,比如說賬號和密碼這樣的隱私資料顯然是不能共享給其他程式的,不過一些可 以讓其他程式進行二次開發的基礎性資料,我們還是可以選擇將其共享的。例如系統的** 簿程式,它的資料庫中儲存了很多的聯絡人資訊,如果這些資料都不允許第三方的程式進行 訪問的話,恐怕很多應用的功能都要大打折扣了。除了**簿之外,還有簡訊、**庫等程 序都實現了跨程式資料共享的功能,而使用的技術當然就是內容提供器了,下面我們就來對 這一技術進行深入的**。

內容提供器簡介

內容提供器(content provider)主要用於在不同的應用程式之間實現資料共享的功能, 它提供了一套完整的機制,允許乙個程式訪問另乙個程式中的資料,同時還能保證被訪資料 的安全性。目前,使用內容提供器是 android 實現跨程式共享資料的標準方式。

不同於檔案儲存和 sharedpreferences 儲存中的兩種全域性可讀寫操作模式,內容提供器可 以選擇只對哪一部分資料進行共享,從而保證我們程式中的隱私資料不會有洩漏的風險。

內容提供器的用法一般有兩種,一種是使用現有的內容提供器來讀取和操作相應程式中 的資料,另一種是建立自己的內容提供器給我們程式的資料提供外部訪問介面。那麼接下來 我們就乙個乙個開始學習吧,首先從使用現有的內容提供器開始。

7.2    訪問其他程式中的資料

當乙個應用程式通過內容提供器對其資料提供了外部訪問介面,任何其他的應用程式就 都可以對這部分資料進行訪問。android 系統中自帶的**簿、簡訊、**庫等程式都提供 了類似的訪問介面,這就使得第三方應用程式可以充分地利用這部分資料來實現更好的功 能。下面我們就來看一看,內容提供器到底是如何使用的。

7.2.1    contentresolver 的基本用法

對於每乙個應用程式來說,如果想要訪問內容提供器中共享的資料,就一定要借助 contentresolve 類,可以通過 context 中的 getcontentresolver() 方法獲取到該類的例項。 contentresolver 中提供了一系列的方法用於對資料進行 crud 操作,其中 insert()方法用於 新增資料,update()方法用於更新資料,delete()方法用於刪除資料,query()方法用於查詢數 據。有沒有似曾相識的感覺?沒錯,sqlitedatabase 中也是使用的這幾個方法來進行 crud 操作的,只不過它們在方法引數上稍微有一些區別。

有沒有發現,內容 uri 可以非常清楚地表達出我們想要訪問哪個程式中哪張表裡的數 據。也正是因此,contentresolver 中的增刪改查方法才都接收 uri 物件作為引數,因為使用 表名的話系統將無法得知我們期望訪問的是哪個應用程式裡的表。

在得到了內容 uri 字串之後,我們還需要將它解析成 uri 物件才可以作為引數傳入。 解析的方法也相當簡單,**如下所示:

只需要呼叫 uri.parse()方法,就可以將內容 uri 字串解析成 uri 物件了。

現在我們就可以使用這個 uri 物件來查詢 table1 表中的資料了,**如下所示:

cursor cursor = getcontentresolver().query(

uri,

projection, selection, selectionargs, sortorder);

這些引數和 sqlitedatabase 中 query()方法裡的引數很像,但總體來說要簡單一些,畢 竟這是在訪問其他程式中的資料,沒必要構建過於複雜的查詢語句。下表對使用到的這部分 引數進行了詳細的解釋。

query()方法引數

對應sql部分

描述uri

from table_name

指定查詢某個應用程式下的某一張表

projection

select column1, column2

指定查詢的列名

selection

where column = value

指定 where 的約束條件

selectionargs

-為 where 中的佔位符提供具體的值

orderby

order by column1, column2

指定查詢結果的排序方式

查詢完成後返回的仍然是乙個 cursor 物件,這時我們就可以將資料從 cursor 物件中逐

個讀取出來了。讀取的思路仍然是通過移動游標的位置來遍歷 cursor 的所有行,然後再取出 每一行中相應列的資料,**如下所示:

if (cursor != null)

cursor.close();

}

掌握了最難的查詢操作,剩下的增加、修改、刪除操作就更不在話下了。我們先來看看 如何向 table1 表中新增一條資料,**如下所示:

contentvalues values = new contentvalues(); values.put("column1", "text"); values.put("column2", 1); getcontentresolver().insert(uri, values);

可以看到,仍然是將待新增的資料組裝到 contentvalues 中,然後呼叫 contentresolver的 insert()方法,將 uri 和 contentvalues 作為引數傳入即可。

現 在 如 果 我 們 想 要 更 新 這 條 新 添 加 的 數 據 , 把 column1 的 值 清 空 , 可 以 借 助

contentresolver 的 update()方法實現,**如下所示:

contentvalues values = new contentvalues();

values.put("column1", "");

getcontentresolver().update(uri, values, "column1 = ? and column2 = ?", new

string );

注意上述**使用了 selection 和 selectionargs 引數來對想要更新的資料進行約束,以防 止所有的行都會受影響。

最後,可以呼叫 contentresolver 的 delete()方法將這條資料刪除掉,**如下所示:

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

到這裡為止,我們就把 contentresolver 中的增刪改查方法全部學完了。是不是感覺非常 簡單?因為這些知識早在上一章中學習 sqlitedatabase 的時候你就已經掌握了,所需特別注 意的就只有 uri 這個引數而已。

Android之內容提供器

內容提供器的用法一般有兩種 1.使用現有的內容提供器來讀取和操作相應程式中的資料。2。建立自己的內容提供器給我們程式的資料提供外部訪問介面。contentresolver的基本用法 要想訪問內容提供器中共享的資料 就一定要借助contentresolver類。可以通過context中的getcont...

內容提供器 建立自己的內容提供器

urimatcher類 匹配內容uri功能 建立內容提供器 新建乙個類myprovider去繼承contentprovider類。contentprovider的六個抽象方法 抽象方法的使用 1 query insert update delete 這四種方法的實現類似,以query 方法為例,如下...

android內容提供者

android四大元件之一,用於跨應用資料共享,我們自己的應用可以通過使用contentprovider機制獲取聯絡人資訊,簡訊,庫等資訊。不要以為只能運算元據庫資料。用getcontentresolver query insert update delete 等方法對錶進行操作 如 獲取聯絡人名字...