Android 跨程式共用資料,探究內容提供器

來源:互聯網
上載者:User

標籤:

  內容提供器(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 跨程式共用資料,探究內容提供器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.