一、內容提供者的作用
1. 應用成需建立的資料庫檔案,預設都是私有的,其他應用程式不具備讀寫許可權
2. 如果真的想把自己的資料庫資料暴露給其他程式訪問,那麼就應該通過內容提供者來暴露。
3. 與aidl有點類似,但不太一樣,aidl是提供記憶體中的資料給其他應用訪問,內容提供者是提供磁碟中的資料給其他應用訪問。
二、使用內容提供者的步驟
1. 自定義乙個類,繼承contentprovider
public class backdoor extends contentprovider {}
2. 註冊,要新增主機名
3. 定義乙個uri匹配器
/**
* 由於應用程式一安裝,就會把程式中的內容提供者口令發布出來,為了提高資料的安全性, 所以必須對來訪的uri(口令),做一些匹配規則過濾一下。
*/// 定義乙個uri的匹配器,指定裡面如果傳遞過來的uri,一旦沒有匹配,將返回的int值 -1
static urimatcher matcher = new urimatcher(urimatcher.no_match);
4. 預設一些匹配規則
static
5. 編寫crud方法
@override
public int delete(uri uri, string selection, string selectionargs) else
return 0;
}
6. 在其他應用操作內容提供者
public void insert(view v)
三、學習內容提供者的目的
1. 一般在開發當中都不會把自己的資料暴露出來,也就是編寫自定義的內容提供者的機率非常之小。
2. 去訪問系統應用暴露出來的資料,如:備份來聯絡人和備份簡訊
四、新增和刪除簡訊
* 新增簡訊
//新增簡訊
public void insert(view v)
* 刪除簡訊
//刪除簡訊
public void delete(view v) );
toast.maketext(this, "刪除短息成功", 0).show();
}
五、介面提醒
1. toast
2. dialog-對話方塊
3. notification -- 通知
> 通知是執行在另外乙個程序中 , systemui
//傳送通知
public void send(view v)
六、聯絡人的內容提供者
6.1 查詢聯絡人
> 1. 查詢raw_contacts表,得到contact_id
> 2. 根據contact_id,去查詢 data1, mimetype型別
6.2 刪除聯絡人
> 刪除聯絡人後,發現並不是真的從資料庫中把這條記錄給移除,而是把contact_id置為null而已,
android之所以這麼做,是為了日後聯網同步所考慮的。
6.3 新增聯絡人
> 先查詢raw_contacts表,獲取到當前的最新_id
//新增一條聯絡人記錄
contentresolver resolver = getcontentresolver();
//2定義查詢raw_contact表的uri
uri contacturi = uri.parse("content:");
//查詢data表的uri
uri datauri = uri.parse("content:");****
//由於不知道當前的contact_id已經走到了多少,所以不能盲目直接編寫,應該去查詢
//該表中的_id列,然後倒序排列,取第一條就可以了。
cursor cursor = resolver.query(contacturi, new string, null, null, "_id desc");
cursor.movetofirst();
int id = cursor.getint(0)+1; //在原來的id基礎上+1 ,形成了現在新新增的id
> 在它基礎上+1 ,得到現在要往資料庫新增的新raw_contact_id
contentvalues values = new contentvalues();
values.put("contact_id", id);
resolver.insert(contacturi, values);
> 最後往data表裡面新增 姓名、**、郵箱...
//往data表裡面新增資料
//新增姓名
contentvalues nameval = new contentvalues();
nameval.put("data1", et_name.gettext().tostring()); //新增姓名
nameval.put("raw_contact_id", id); //新增這個資料屬於誰的uri
nameval.put("mimetype", "vnd.android.cursor.item/name"); //指定新增的資料屬於什麼型別
resolver.insert(datauri, nameval);//插入記錄
七、內容觀察者
> 內容觀察者實際上就是當資料的資料發生了改變之後,發布出來乙個通知,如果有哪乙個內容觀察者
> 在觀察這個uri對應的路徑,那麼就會收到這個通知
* 發布通知
// 對外發布乙個通知,告訴其他人,這個uri對應的資料已經發生了改變。如果第二個引數不是null,
//那麼在此指定的這個內容觀察者將會收到這個通知,如果是null,代表的是不會直接報告給某乙個內容觀察者,
//僅僅是發出來乙個通知,如果有關心這個通知,那麼久能知道事件的發生
getcontext().getcontentresolver().notifychange(uri, null);
注意:發布通知這個事件不一定在內容觀察者裡面執行,也可以在資料庫操作完成之後執行。
* 註冊乙個內容觀察者
uri uri = uri.parse("content:");
//註冊乙個內容觀察者,讓他觀察指定的uri, 如果這個uri的資料發生了改變,那麼將會得到通知
getcontentresolver().registercontentobserver(
uri, //觀察指定的uri
true, // 如果是true, 代表只要前面的uri能夠匹配成功,那麼就會收到通知,如果是false代表的時候
//要所有的路徑都完全匹配
new contentobserver(new handler())
});
Android的內容觀察者
有個很常見的需求就是當有新的簡訊來的時候,把內容顯示在介面上。這裡就要用到內容觀察者。就是讓你的程式監視簡訊,如果他內容發生變化的時候,你去獲取。而簡訊那邊做的情況就 是,當他自己的資料變化時,他告訴有個公共簡訊記憶體區,他說,我資料變化了!然後通過簡訊的內容提供者把簡訊的內容拿到公共記憶體區,你的...
內容觀察者
1,註冊內容觀察者 getcontentresolver registercontentobserver uri,true,observer observer 實現contentobserver類的下面方法 override public void onchange boolean selfchan...
內容觀察者
uri uri uri.parse content 其中第二引數時乙個boolean,如果為true,表示uri可以時非完整的路徑,如果是false,就必須要是乙個完整的uri,上面的uri就是非完整的。第三個引數是contentreserver getcontentresolver registe...