內容提供器使資料在不同的程式中實現共享
分類:現有的內容提供器,自定義的內容伺服器
對於每個程式來說,如果想要訪問內容提供器中的資料,一定要借助contentresolver類,可以通過context中的getcontentresolver方法得到該類的例項。contentresolver中提供了一系列的方法用於對資料進行crud操作。
contentresolver中的增刪改查方法接受的是uri引數,被稱為內容uri
由authority和path兩部分組成
authority:一般包名.provider
path:表名
需要解析未uri物件才可以作為引數傳入
1. 如:uri uri = uri.parse(
);
查詢
查詢完成後返回的是乙個cursor物件,對cursor物件進行遍歷得到我們所需要的資料
新增
將待新增的資料組裝到contentvalues中,再用insert
1.
contentvalues values =newcontentvalues();
2.
values.put(
"column1"
, "text"
);
3.
values.put(
"column2", 1
);
4.
getcontentresolver.insert(uri, values);
更新
將待跟新的資料組裝到contentvalues中,再update
1.
contentvalues values =newcontentvalues();
2.
values.put(
"column1"
, ""
);
3.
getcontentresolver.update(uri, values,
"column1 = ?"
,newstring );
刪除
1.
getcontentresolver().delete(uri,」column2=」,newstring);
例子:查詢手機中的通訊裡(只給出查詢**,完整需要新增許可權)
其中的uri被系統已經封裝好的通訊的uri
1.privatevoidreadcontacts()
15.
}catch(exception e)finally
21.
} 22.
} 實現跨程式共享資料的功能,官方推薦的就是使用內容提供其,可以通過新建乙個類去繼承contentprovider的方式來建立乙個自己的內容提供器。
需要重寫contentprovider中的6個抽象方法
初始化內容提供器的時候呼叫。通常會在這裡完成對資料庫的建立和公升級等操作,返回 true 表示內容提供器初始化成功,返回 false 則表示失敗。注意,只有當存在 contentresolver 嘗試訪問我們程式中的資料時,內容提供器才會被初始化。
2.query()
從內容提供器中查詢資料。使用 uri 引數來確定查詢哪張表,projection 引數用於確定查詢哪些列,selection 和 selectionargs 引數用於約束查詢哪些行,sortorder 引數用於對結果進行排序,查詢的結果存放在 cursor 物件中返回。
3.insert()
向內容提供器中新增一條資料。使用 uri 引數來確定要新增到的表,待新增的資料儲存在 values 引數中。新增完成後,返回乙個用於表示這條新記錄的 uri。
4. update()
更新內容提供器中已有的資料。使用 uri 引數來確定更新哪一張表中的資料,新資料儲存在 values 引數中,selection 和 selectionargs 引數用於約束更新哪些行,受影響的行數將作為返回值返回。
5. delete()
從內容提供器中刪除資料。使用 uri 引數來確定刪除哪一張表中的資料,selection和 selectionargs 引數用於約束刪除哪些行,被刪除的行數將作為返回值返回。
6.gettype()
根據傳入的內容 uri 來返回相應的 mime 型別。
gettype()方法。它是所有的內容提供器都必 須提供的乙個方法,用於獲取uri 物件所對應的 mime 型別。乙個內容 uri 所對應的 mime 字串主要由三部分組分,android 對這三個部分做了如下格式規定。
1. 必須以 vnd 開頭。
2. 如果內容 uri 以路徑結尾,則後接 android.cursor.dir/,如果內容 uri 以 id 結尾,則後接 android.cursor.item/。
3. 最後接上 vnd..。
型別就可以寫成:
可以看到,幾乎每乙個方法都會帶有 uri 這個引數,這個引數也正是呼叫 contentresolver的增刪改查方法時傳遞過來的。而現在,我們需要對傳入的 uri 引數進行解析,從中分析出呼叫方期望訪問的表和資料。
回顧一下,乙個標準的內容 uri 寫法是這樣的:
1. *:表示匹配任意長度的任意字元
2. #:表示匹配任意長度的數字
所以,乙個能夠匹配任意表的內容 uri 格式就可以寫成:
而乙個能夠匹配 table1 表中任意一行資料的內容 uri 格式就可以寫成:
所以要使用urimatcher來進行匹配,urimatcher中提供了乙個adduri方法,接受三個引數,authority,path,和乙個自定義**。倒是後匹配成功後返回的是這個自定義**,利用這個**就可以判斷訪問的是哪個表中的資料了
例子:public
class
myprovider extends
contentprovider
……@override
public
cursor query(uri uri,string projection, string selection, string selectionargs, stringsortorder) ……}
……}以外部查詢為例:
外部傳入內容uri,自定義內容提供器中會再static初始化模組中新建乙個urimatcher物件,並且給他新增好對應關係。
在query方法中,會通過switch方法找出外部需要查詢的**。再進行操作
其他方法同理
第一行** 例子
安卓四大元件 內容提供器 2
內容提供器提供了兩種方法,一種是使用現有的內容提供器來讀取和操作相應的程式中的資料,另一種是建立自己的內容提供器給我們的程式資料提供外部訪問介面。接下來就從使用現有的內容提供器開始。什麼是現有的內容提供器呢?其實就是我們手機上使用系統自帶的 薄,簡訊,庫等程式。它們提供了類似的訪問介面,這就使得第三...
Android四大元件之 內容提供者
內容提供者說簡單了就是像外提供乙個uri,然後別人去匹配這個uri就可以使用你定義好的一些方法 下面寫個例項來介紹一下contentprodvider 寫乙個內容提供者的類 personcontentprovider 類 package com.example.sqlitedemo.provider...
安卓四大元件 內容提供器 2 訪問其他程式中的資料
內容提供器提供了兩種方法,一種是使用現有的內容提供器來讀取和操作相應的程式中的資料,另一種是建立自己的內容提供器給我們的程式資料提供外部訪問介面。接下來就從使用現有的內容提供器開始。什麼是現有的內容提供器呢?其實就是我們手機上使用系統自帶的 薄,簡訊,庫等程式。它們提供了類似的訪問介面,這就使得第三...