部分轉載自:ConntentProvider 從入門到精通
ContentProvider的角色
ContentProvider 一般爲存儲和獲取數據提供統一的接口,可以在不同的應用程序之間共享數據。
之所以使用ContentProvider,主要有以下幾個理由:
ContentProvider提供了對底層數據存儲方式的抽象。底層使用了SQLite數據庫,在用了ContentProvider封裝後,即使你把數據庫換成MongoDB,也不會對上層數據使用層代碼產生影響。
Android框架中的一些類需要ContentProvider類型數據。如果你想讓你的數據可以使用在如SyncAdapter,Loader,CursorAdapter等類上,那麼你就需要爲你的數據做一層ContentProvider封裝。
- 第三個原因也是最主要的原因,是ContentProvider爲應用間的數據交互提供了一個安全的環境。它准許你把自己的應用數據根據需求開放給其他應用進行增、刪、改、查,而不用擔心直接開放數據庫權限而帶來的安全問題。
ContentResolver
有些人可能會疑惑,爲什麼我們不直接訪問Provider,而是又在上面加了一層ContentResolver來進行對其的操作,這樣豈不是更復雜了嗎?其實不然,大家要知道一臺手機中可不是隻有一個Provider內容,它可能安裝了很多含有Provider的應用,比如聯繫人應用,日曆應用,字典應用等等。有如此多的Provider,如果你開發一款應用要使用其中多個,如果讓你去了解每個ContentProvider的不同實現,豈不是要頭都大了。所以Android爲我們提供了ContentResolver來統一管理與不同ContentProvider間的操作。
那ContentResolver是如何來區別不同的ContentProvider的呢?這就涉及到URI(Uniform Resource Identifier)問題。
ContentProvider 中的URI 有固定的格式:
- Authority:授權信息,用以區別不同的ContentProvider;
- Path:表名,用以區分ContentProvider中不同的數據表;
- Id:Id號,用以區別表中的不同數據;