標籤:
內容提供器(Content Provider)主要用於在不同的應用程式之間實現資料共用的功能,它提供了一套完整的機制,允許一個程式訪問另一個程式中的資料,同時還能保證被訪問資料的安全性。目前,使用內容提供器是 Android 實現跨程式共用資料的標準方式。
不同於檔案儲存體和 SharePreferences 儲存中的兩種全域可讀寫操作模式,內容提供器可以選擇只對哪一部分資料進行共用,從而保證我們程式中的隱私資料不會有泄露的風險。
訪問其他程式中的資料:
對於每一個應用程式來說,如果想要訪問內容提供器中共用的資料,就一定要藉助 ContentResolver 類,可以通過 Context 中的 getContentResolver()方法擷取到該類的執行個體。
ContentResolver 中提供了一系列方法用於對資料進行增刪改查的操作,其中 insert() 方法用於添加資料,update()方法用於更新資料,delete()方法用於刪除資料,query()方法用於查詢資料,操作方式與 SQLiteDatabase 類似,只不過它們在方法參數上稍微有一些區別。
不同於 SQLiteDatabase,ContentResolver 中的增刪改查方法都是不接受表名參數的,而是使用一個URI參數代替,這個參數被稱為內容 URI。內容 URI 給內容提供器中的資料建立了唯一識別碼,它主要由兩部分組成,許可權(authority)和路徑(path)。許可權是用於對不同的應用程式做區分的,一般為了避免衝突,都會採用程式包名的方式來進行命名。路徑則是用於對同一應用程式中不同的表做區分的,通常都會添加到許可權的後面。
例如某個程式的包名是 com.example.app,那麼該程式對應的許可權就可以命名為 com.example.app.provider。而該程式的資料庫裡存在兩張表,table1和table2,這時就可以將路徑分別命名為/table1和/table2,然後把許可權和路徑進行組合,內容 URI 就變成了 com.example.app.provider/table1 和 com.example.app.provider/table2,最後還需要在字串的頭部加上協議聲明。因此,內容 URI 最標準的格式寫法如下:
content://com.example.app.provider/table1
content://com.example.app.provider/table2
內容 URI 可以非常清楚的表達出我們想要訪問哪個程式中哪張表裡的資料。也正是如此,ContentResolver 中的增刪改查方法才都接收 Uri 對象作為參數。在得到內容URI字串之後,還需要將它解析成 Uri 對象才可以作為參數傳入。只需要調用 Uri.parse() 方法,就可以將內容 URI 字串解析成 Uri 對象了。
Uri uri = Uri.parse("content://com.example.app.provider/table1")
現在我們就可以使用這個 Uri 對象來查詢 table1 表中的資料了,代碼如下所示:
Cursor cursor = getContentResolver().query( uri , projection , selection , selectionArgs , sortOrder );
這些參數和 SQLiteDatabase 中 query()方法裡的參數很像,但總體來說要簡單一些,畢竟這是在訪問其他程式中的資料,沒必要構建過於複雜的查詢語句。
query() 方法參數描述:
uri:指定查詢某個應用程式下的某一張表,對應 from table_name
projection:指定查詢的列名,對應 select column1,column2
selection:指定 where 的約束條件,對應 where column = value
selectionArgs:為 where 中的預留位置提供具體的值
orderBy:指定查詢結果的排序方式,對應 order by column
查詢完成後返回的仍然是一個 Cursor 對象,這時我們就可以將資料從 Cursor 對象中逐個讀取出來。讀取的思路仍然是通過移動遊標的位置來遍曆 Cursor 的所有行,然後取出每一行相對應的資料。
掌握了最難的查詢操作,剩下的增加、修改、刪除操作就更不在話下了。
總結:
ContentResolver 中的基本操作和 SQLiteDatabase 中的操作類似,只不過 ContentResolver 不像 SQLiteDatabase 一樣接收表名作為參數,而是使用內容 URI 來定位具體的程式和資料表,而內容URI是由 "content://" + 許可權 + 路徑 組成,通過 Uri.parser() 方法將內容 URI 字串解析成 Uri 對象。
如果你看的比較吃力,說明你還需要重新溫習一下 SQLiteDatabase:Android 資料存放區之 SQLite資料庫儲存
Android 跨程式共用資料,探究內容提供器