我有一个自定义ContentProvider
类,我最初是在同一项目文件中使用它开发的应用程序。但是,由于此应用程序只是ContentProvider
的许多用户之一,我想将其拆分为不同的项目。代码正在Android PDK上开发,但未来的客户端可能是在SDK上开发的(在自定义SDK或SDK插件等上)。
我面临的问题是关于ContentProvider
类中的常量,例如CONTENT_URI,列名以及用于解释查询返回值的一些常量。这些当然不能从另一个项目访问。在我看来,我现在有3个选择:
1)忽略该问题,并直接在用户应用程序代码中键入值。然而,这使得访问ContentProvider
更加丑陋。我将不得不更改一些列,用字符串而不是整数编码一些列,以保持代码可维护。
2)将常量放在一个单独的类中,并使用ContentProvider
在应用程序中包含完整副本。我不是复制代码的粉丝。在每个目标应用程序中保留此代码的副本,将使某些事情更难以维护。
vendor/sample/frameworks/PlatformLibrary
中所述。但是,平台库没有清单文件,如果我的理解正确,则意味着我不能包含ContentProvider
。这意味着我需要ContactProvider
的一个“普通”项目,以及一个单独的项目来公开具有常量值的类。这感觉太错了。
Class structure for a ContentProvider having multiple sub tables的答案似乎意味着选项(1),这可能看起来是目前最好的选择。
然而,也许我错过了另一个,整洁的&整洁,这样做的方式?请记住,我正在开发PDK,我当然希望我的ContentProvider
可以像谷歌供应商一样使用。
答案 0 :(得分:3)
您可能已经有至少一个类/接口使用静态常量为列名,内容URI等定义ContentProvider
的“契约”。
如果你把它放到自己的Android SDK库项目中(只是让Android类在build / classpath上),你可以使用实际的SDK / PDK应用程序ContentProvider
中的这个库并分发它它作为myapp-api.jar
JAR供其他人使用。
通过这种方式,您可以获得两全其美的效果:没有过时的代码(因为您的ContentProvider
依赖于它),而其他人可以使用漂亮的常量来获取URI和列名。
有关合同类的示例,请参阅ContactsContract。