Android 開發(fā)藝術探索之---ContentProvider(內容提供者)

1.什么是內容提供者?

?? ? 首先在android 開發(fā)藝術探索這邊書中 我們都知道ContentProvider(內容提供者)是android中的四大組件之一略荡,但是在一般的開發(fā)中,可能使用比較少蹬叭。ContentProvider為不同的軟件之間數(shù)據(jù)共享乡摹,提供統(tǒng)一的接口。而且ContentProvider是以類似數(shù)據(jù)庫中表的方式將數(shù)據(jù)暴露缩赛,也就是說ContentProvider就像一個“數(shù)據(jù)庫”耙箍。那么外界獲取其提供的數(shù)據(jù),也就應該與從數(shù)據(jù)庫中獲取數(shù)據(jù)的操作基本一樣酥馍,只不過是采用URI來表示外界需要訪問的“數(shù)據(jù)庫”辩昆。至于如何從URI中識別出外界需要的是哪個“數(shù)據(jù)庫”這就是Android底層需要做的事情了,也就是說旨袒,如果我們想讓其他的應用使用我們自己程序內的數(shù)據(jù)汁针,就可以使用ContentProvider定義一個對外開放的接口,從而使得其他的應用可以使用我們自己應用中的文件砚尽、數(shù)據(jù)庫內存儲的信息施无。當然,自己開發(fā)的應用需要給其他應用共享信息的需求可能比較少見必孤,但是在Android系統(tǒng)中猾骡,很多數(shù)據(jù)如:聯(lián)系人信息、短信信息敷搪、圖片庫兴想、音頻庫等,這些信息在開發(fā)中還是經(jīng)常用到的购啄,這些信息谷歌工程師已經(jīng)幫我們封裝好了襟企,我們可以使用谷歌給我的Uri去直接訪問這些數(shù)據(jù)。所以對于ContentProvider我們還是需要認真的學習的狮含,在遇到獲取聯(lián)系人信息顽悼,圖片庫,音視頻庫等需求的時候几迄,才能更好的實現(xiàn)功能蔚龙。

2.為什么會有內容提供者?

? ? ? ?當應用繼承ContentProvider類映胁,并重寫該類用于提供數(shù)據(jù)和存儲數(shù)據(jù)的方法木羹,就可以向其他應用共享其數(shù)據(jù)。雖然使用其他方法也可以對外共享數(shù)據(jù),但數(shù)據(jù)訪問方式會因數(shù)據(jù)存儲的方式而不同坑填,如:采用文件方式對外共享數(shù)據(jù)抛人,需要進行文件操作讀寫數(shù)據(jù);采用sharedpreferences共享數(shù)據(jù)脐瑰,需要使用sharedpreferences API讀寫數(shù)據(jù)妖枚。而使用ContentProvider共享數(shù)據(jù)的好處是統(tǒng)一了數(shù)據(jù)訪問方式,這也是為什么會有內容提供者的原因苍在。

在這里解釋一下:怎么理解ContentProvider統(tǒng)一了數(shù)據(jù)訪問方式

根據(jù)官網(wǎng)上的描述绝页,content?provider主要是提供應用程序之間的數(shù)據(jù)共享。比如App A?需要App B的數(shù)據(jù)能用shared?preference寂恬?用文件的話续誉,還只能用external?file,但是可能沒有外存初肉,文件可能會被刪除酷鸦,權限問題等等。所以content?provider+content?resolver是最好的方式朴译。

而且記住井佑,content?provider+content?resolver只是提供了應用程序之間的一個通道,具體的數(shù)據(jù)處理是在content?provider中眠寿,contetn provider 對底層的數(shù)據(jù)存儲方法沒有任何的要求 有可能是文件躬翁,可能是sqlite怒见,也有可能是采用內存中的一個對象來進行數(shù)據(jù)存儲印颤。

3.應該怎么實現(xiàn)自己的ContentProvider?

下面是一個簡單的實列 他演示了ContentProvider的工作過程 首先是創(chuàng)建一個MyContentProvider類 ,它繼承ContentProvider并實現(xiàn)了ContentProvider的六個必須要實現(xiàn)的方法 ?在下面代碼中 我們什么都么有干 盡管如此 ?這個MyContentProvider 也是可以工作的 ?只是它無法向外界提供有效的數(shù)據(jù)而已


然后接著我們需要在功能清單中Manifest中注冊 MyContentProvider 如下圖所示 其中 android:authorities="star.liuwen.com.endcontentprovider.MyContentProvider" 是ContentProvider中的唯一標識 ?而process 則是獨立進程的標志 ?



MainActivuty中的代碼

然后我們可以看到打印出來的日志


從日志中我們可以看到MyContentProvider 中的query方法被調用了三次 并且三次都是在不同的線程當中 ?可以看出來 ?他們都是運行在一個BInder線程當中 ?而onCreate()方法則是在主線程當中 ?也就是我們的UI線程

到這里 我們自定義的MyContentProvider 已經(jīng)跑通了 雖然MyContentProvider 中沒有返回任何的數(shù)據(jù) 所以接下來 我們繼續(xù)完善 需要MyContentProvider 能夠對外提供數(shù)據(jù) 上面我寫了Contetn provider 對底層的數(shù)據(jù)存儲方法沒有任何的要求 可以是文件 也可以是SqLite 這里我們簡單的用SqLite來實現(xiàn)存儲


SqLiteHelper數(shù)據(jù)幫手

上面代碼是一個簡單的數(shù)據(jù)庫實現(xiàn) 我們借助SqLiteHelper 來管理數(shù)據(jù)可的創(chuàng)建 支持 和升級 下面我們就要通過MyContentProvider向外界提供數(shù)據(jù)庫中的信息 ?我們知道 ContentProvider 是通過Uri 來區(qū)分外界要訪問的數(shù)據(jù)集合 在本列中支持外界對MyContentProvider 中的book表 和user表進行訪問 為了知道外界要訪問的是哪個表 我們需要為他們定義單獨的Uri 和Uri_code 并將Uri和Uri_code 相關聯(lián) 我們可以使用UriMatcher的addUrI方法將Uri_code關聯(lián)到一起 這樣 當外界請求訪問MyContentProvider 時玛迄,我們就可以根據(jù)請求的Uri來得到Uri_code 有了Uri_code 我們就可以知道外界想要訪問哪個表 然后就可以進行相應的數(shù)據(jù)操作了?


完整代碼就是這樣的?

下面在看Activity中的 代碼


我這里的代碼都是截圖 也是希望大家能自己敲一遍 好 接下來我們看打印的日志是怎樣的


打印日志
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末狡逢,一起剝皮案震驚了整個濱河市宁舰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奢浑,老刑警劉巖蛮艰,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異雀彼,居然都是意外死亡壤蚜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門徊哑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來袜刷,“玉大人,你說我怎么就攤上這事莺丑≈罚” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長萧豆。 經(jīng)常有香客問我奸披,道長,這世上最難降的妖魔是什么炕横? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任源内,我火速辦了婚禮,結果婚禮上份殿,老公的妹妹穿的比我還像新娘。我一直安慰自己嗽交,他們只是感情好卿嘲,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著夫壁,像睡著了一般拾枣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盒让,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天梅肤,我揣著相機與錄音,去河邊找鬼邑茄。 笑死姨蝴,一個胖子當著我的面吹牛,可吹牛的內容都是我干的肺缕。 我是一名探鬼主播左医,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼同木!你這毒婦竟也來了浮梢?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤彤路,失蹤者是張志新(化名)和其女友劉穎秕硝,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洲尊,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡远豺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了颊郎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片憋飞。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖姆吭,靈堂內的尸體忽然破棺而出榛做,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布检眯,位于F島的核電站厘擂,受9級特大地震影響,放射性物質發(fā)生泄漏锰瘸。R本人自食惡果不足惜刽严,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望避凝。 院中可真熱鬧舞萄,春花似錦、人聲如沸管削。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽含思。三九已至崎弃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間含潘,已是汗流浹背饲做。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留遏弱,地道東北人盆均。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像腾窝,于是被迫代替她去往敵國和親缀踪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內容