2011-02-08 123 views
90

我知道內容提供商允許在應用程序之間公開共享數據。不過,我想知道是否有人想讓內容提供商只在您自己的應用程序中使用。這樣做會有什麼好處嗎?有什麼缺點?何時使用內容提供商

在過去,我剛剛使用SQliteOpenHelper從我的數據庫訪問數據,但我正在考慮創建一個Content Provider。我覺得URI請求數據的方法是清晰和簡潔的。另一方面,僅僅爲我的應用程序使用內容提供程序會是多餘的(因爲在它內部,我將擁有一個SQliteOpenHelper類),而且比我需要更多的工作?

+2

我做了一個庫,使內容提供商易於編寫。 比寫簡單的SQLiteOpenHelper更容易。 https://github.com/coocood/VContentProvider – coocood 2012-12-10 01:25:48

回答

50

如果您不打算共享數據,請不要考慮內容提供商。它們功能強大但很難編寫,如果要在內部使用它們,實施它們將會很愚蠢。

但是,我想知道是否有人想讓內容提供商只在您自己的應用程序中使用。

當然......例如,對於一個老待辦事項清單應用程序我寫的,我不得不寫一個內容提供商,讓其他應用檢索和訪問任務的狀態。這是要求的一部分,但更重要的是它有意義,並使應用程序更好。

+34

我同意您的理由,但我也認爲這對於一旦實施內容提供商後很重要(對初學者尤其如此),您將獲得很多好處。例如,您可以使用`CursorLoader`來執行異步查詢...您可以訪問單例實例(ContentResolver)來執行查詢等。當然,您可以實現自己的Loader以用於SQLite數據庫......當然,您可以在整個應用程序中實現對單個數據庫實例的訪問...當然,除非您想與其他應用程序共享 – 2012-06-27 18:32:17

+10

數據,否則不需要ContentProvider。也就是說,實現自己的Content Provider有很多好處,所以你不應該因爲你的應用不共享它的數據而忽略它。 – 2012-06-27 18:34:15

+7

是的,你是完全正確的,但我仍然認爲它在大多數情況下都不值得。我已經完成了至少12個不同的Android應用(發佈到Play商店),並且從不需要「ContentProvider」。實際上,我們正在開發的最後一個應用程序最初是用一個`ContentProvider`製作的,我們只是刪除了它,因爲它實際上比使用它更麻煩(我甚至寫了一個庫來使它更容易實現基本的`ContentProvider`s:https://github.com/casidiablo/persistence但從未使用它我自己的XD)。 – Cristian 2012-06-27 22:25:53

7

看看MOTODEV Studio for Eclipse。這是一個擴展Eclipse的開發環境。他們有一個工具,您可以自動爲數據庫生成內容提供者。如果內容提供商更容易訪問您的數據,並且不會對性能產生重大影響,請繼續使用它。在大多數情況下,情況就是這樣。

109

我認爲使用ContentProvider絕對是一個好主意,即使您不打算公開。

爲您的數據提供額外的抽象級別以便更易於在內部進行更改是一種很好的做法。如果您決定稍後更改底層數據庫結構會怎麼樣?如果使用ContentProvider,則可以包含其中的所有結構更改,如果不使用它,則必須更改受結構更改影響的代碼的所有區域。此外,能夠重複使用相同的標準API來訪問數據,而不是通過對數據庫的低級訪問來亂拋垃圾的代碼是很好的。

此外,您總有可能希望將來公開您的數據。如果您事先不使用ContentProvider,那麼在以後更新它將會困難得多。

然後,還有其他需要/推薦ContentProvider的Android版本,例如使用SyncAdapter時,以及是否需要一個涉及數據訪問的App Widget。

總的來說,在寫一個ContentProvider(前提是你已經學習API了,這是一個好主意),所以這樣做很有意義,即使對於私人數據也是如此。

4

我同意內容提供者有點難以掌握,但他們肯定是有幫助的,即使你想在你的內部爲你自己的應用程序使用它們。關於它的最好的事情是,您可以自定義內容提供商以獲取合適的URI。

這裏有這樣一個場景,你可能在你的數據庫5桌,但你需要在使用前加入他們幾個在某些命令。併爲這些連接中的每一個建立一個內容URI。然後,您可以使用每一個這些URI爲表:)

我建議你繼續與內容提供商,你會驚訝地發現它是多麼的強大。

-1

如果不希望與其他應用程序共享數據,請勿使用內容提供程序。使用簡單的sqlitedatabase來執行數據庫操作。要小心,同時使用內容提供商存儲的機密數據,因爲您的機密信息可能被其他應用程序

2

在我的觀點進行訪問,內容提供者配備了充足的優勢獨自離開只是與其他應用程序共享數據。如果您需要使用同步適配器與服務器同步,請使用Google雲消息傳遞,使用Loaders在數據庫中更改底層數據時自動更新UI,實現搜索,使用小部件...然後內容提供商將爲您提供幫助。

我更喜歡你遵循因爲有一天你可能需要實現一些附加到內容提供商

順便說上面的功能,可以快速構建你的數據庫和CP在不到5指引使用content provider generator

0

隨着分鐘,文件說: Creating a Content provider

您不需要提供程序來使用SQLite數據庫,如果使用是完全 自己的應用程序中。

何必制定這方面的開銷?你想更容易和更快的發展,對吧?所以一層抽象(SQLiteOpenHelper後裔)就足夠了。

Occam's Razor 沒有很好的理由不要讓一個實體。

2

總之,Content Providers幫助有效管理您的數據。我建議使用它們的原因如下。

  • 它充當您的UI和數據庫之間的抽象層。您可以在ContentProviders中實施數據驗證以驗證用戶輸入的數據。它還可以讓你在不觸及UI和其他部分的情況下修改數據庫的結構的
  • 他們一起玩很好地與其他Android框架類SyncAdapter。例如,當數據庫中的值使用ContentProvider與CursorLoader一起更改時,您可以自動刷新列表。如果沒有ContentProvider,你必須自己實現許多這樣的功能。
  • 我們可以安全地將我們的私人數據暴露給其他應用程序。使用ContentProviders將使我們能夠輕鬆安全地與其他應用程序共享我們的數據。

因此,即使您現在不需要任何這些功能,您將來也可能需要它們,並且很高興能夠繼續努力,並且現在就可以實施它們。