2010-11-15 71 views
1

我有一個自定義ContentProvider類,它最初是在與使用它的應用程序在同一個項目文件中開發的。但是,由於此應用程序只是ContentProvider的許多用戶中的一個,我想將其拆分到不同的項目中。代碼是在Android PDK上開發的,但未來的客戶端可能會在SDK上開發(在自定義SDK或SDK插件等上)。有沒有一種「適當」的方法來保持內容提供者實現與用戶分離?

我面臨的問題是關於ContentProvider類中的常量,例如, CONTENT_URI,列名以及用於解釋從查詢返回的值的一些常量。這些當然不能從另一個項目訪問。在我看來,我現在有3個選項:

1)忽略問題,並直接在用戶應用程序代碼中輸入值。然而,這使得訪問ContentProvider醜陋。我將不得不改變一些列,使用字符串而不是整數對一些列進行編碼,以保持代碼的可維護性。

2)將常量放入單獨的類中,並在使用ContentProvider的應用程序中包含完整副本。雖然我不喜歡複製代碼。在每個目標應用程序中保留這些代碼的副本,會使一些事情更容易維護。

3)濫用我在PDK上開發的事實,並暴露平臺庫,如vendor/sample/frameworks/PlatformLibrary中所述。但是,平臺庫沒有清單文件,如果我的理解正確,則意味着我不能包含ContentProvider。這意味着我需要一個ContactProvider的「正常」項目,另一個項目只是爲了暴露類的常量值。這感覺非常錯誤。

Class structure for a ContentProvider having multiple sub tables的答案似乎意味着選項(1),這可能看起來像現在最好的選項。

但是,也許我已經錯過了另一個整潔的方式來做到這一點?請記住,我正在開發PDK,我一定會喜歡我的ContentProvider以與Google提供商相同的方式使用。

回答

3

你可能已經至少有一個類/接口定義爲列名的ContentProvider使用靜態常量的「合同」,內容URI等

如果你把這個變成了自己的Android SDK庫項目(僅適用於構建/類路徑中的Android類),則可以使用實際的SDK/PDK應用程序的ContentProvider中的該庫,並將其分發爲myapp-api.jar JAR供他人使用。

這樣你就可以得到兩全其美的效果:沒有過時的代碼(因爲你的ContentProvider依賴於它),而其他人可以爲URI和列名使用漂亮的常量。

有關合同類的示例,請參閱ContactsContract

相關問題