2008年11月10日 星期一

如何使用 Content Provider

How to retrieve data through content providers?

在 Android 中,每個應用程式都是用自己的 user ID 及在自己的 process 中執行。這樣做的好處是,可以保護系統及應用程式,避免被其他不正常的應用程式所影響。你可以想像每個 process ,都是一個個的黑盒子,彼此不會互相影響,連記憶體內的資料都無法共享。

保護的目的是達到了,不過當應用程式彼此間要分享資料時,這樣的架構勢必要提供一個好的解決方案才行。例如,Contacts 這個應用程式內存滿了使用者的聯絡人資料。當你在 Email 這個應用程式,要填寫收信人時,就希望去讀取 Contacts 內的聯絡人資料。無法直接透過記憶體分享資料,倒是可以透過檔案來分享。

透過檔案來分享資料,其實是最後的招數,因為他有很多的問題。像是,如何避免不同的人同時讀寫同一份檔案,檔案的內容格式還要公開,要不然別人不曉得如何讀起。

為了解決應用程式間,彼此要分享資料的需求,Android 提供了 ContentProvider 這個機制。

想要進一步了解 ContentProvider 的你,我建議你先讀下面這個文件。

Accessing Content Providers: <sdk-path>/docs/devel/data/contentproviders.html

目前在 Android 上已經提供你透過 ContentProvider 去存取下面這些資訊。

我在這裡就先分享一個如何透過 ContentProvider 讀取系統設定參數 (Settings) 的例子。

在我的模擬器上,印出來的結果如下。

4 則留言:

Poyo_Hsu 提到...

Sam你好,之前上過Sam在新竹所開的課程,剛好就少了content provider的介紹。在看了這篇文章之後,有幾個疑問想跟Sam請教一下:
1. 看了一下device上的file system, /data/data裡也有許多com.android.providers.*的目錄,應該是代表content provider也是有自已的package name,那這樣如果有人用content resolver來query資料時,OS也會create出provider相對應的process嗎?
2. 是否有文章介紹關於Content provider的運作原理?
謝謝

samlu 提到...

ContentProvider 和你的應用是同一個 process 的,除非你特別指定。

每個 ContentProvider 都要指定唯一的 "android:authorities",一般來說,都會設成和 package name 相同。不過,這不是強制性的規定,你只要唯一即可。

SDK 文件中,就有關於 ContentProvider 的說明。我覺得這已經很詳細了。

henry 提到...

你好,請問一下關於content provide的一些問題
我在internal storage內存了一些檔案(pdf,doc等等)

然後我想用intent的方式打開檔案,但是都顯示路徑不存在之類的錯誤

網路上有人說使用content provider可以讓其他應用程式看到internal storage的檔案
可是網路上的教學都是關於使用sqlite的比較多
請問我該怎麼讓internal storage的檔案能夠在其他應用程式開啟呢?
感謝了!!

samlu 提到...

To henry: 網路上找應該都有資料。
我剛試了一下,找到這個:http://androidforums.com/application-development/48709-creating-our-own-local-content-provider.html

張貼留言