【问题标题】:Is there a "proper" way to keep a content provider implementation seperate from it's users?是否有一种“正确”的方法可以将内容提供者的实现与其用户分开?
【发布时间】:2011-08-25 16:31:22
【问题描述】:

我有一个自定义的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 供应商相同的方式使用。

【问题讨论】:

    标签: android android-contentprovider


    【解决方案1】:

    您可能已经拥有至少一个类/接口来定义 ContentProvider 的“合同”,使用列名的静态常量、内容 URI 等。

    如果您将其放入其自己的 Android SDK 库项目中(仅用于构建/类路径中的 Android 类),则您可以从您的实际 SDK/PDK 应用程序的ContentProvider 中使用此库,并将其分发为myapp-api.jarJAR 供他人使用。

    这样您就可以两全其美:没有过时的代码(因为您的 ContentProvider 依赖于它)并且其他人可以为 URI 和列名使用漂亮的常量。

    有关合约类的示例,请参阅ContactsContract

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      • 1970-01-01
      • 1970-01-01
      • 2018-10-26
      • 2016-09-24
      • 1970-01-01
      相关资源
      最近更新 更多