android - 是否有一种 "proper"方法可以将内容提供程序实现与其用户分开?

标签 android android-contentprovider

我有一个自定义的 ContentProvider 类,我最初是在与使用它的应用程序相同的项目文件中开发的。但是,由于此应用程序只是 ContentProvider 的众多用户之一,因此我想将其拆分到不同的项目中。代码是在 Android PDK 上开发的,但 future 的客户端可能会在 SDK 上开发(在自定义 SDK 或 SDK 插件等上)。

我面临的问题是关于 ContentProvider 类中的常量,例如CONTENT_URI、列名以及一些用于解释查询返回值的常量。这些当然不能从另一个项目访问。在我看来,此时我有 3 个选择:

1) 忽略问题,直接在用户应用程序代码中输入值。然而,这使得访问 ContentProvider 变得更难看。我将不得不更改一些列,用字符串而不是整数对一些列进行编码,以保持代码的可维护性。

2) 将常量放在单独的类中,并在使用 ContentProvider 的应用程序中包含完整副本。不过,我不喜欢复制代码。在每个目标应用程序中保留此代码的副本,会使某些事情的维护变得更加烦人。

3) 滥用我正在 PDK 上开发的事实,并公开一个平台库,如 vendor/sample/frameworks/PlatformLibrary 中所述。但是,平台库没有 list 文件,如果我的理解是正确的,这意味着我不能包含 ContentProvider。这意味着我需要一个用于 ContactProvider 的“正常”项目,以及一个单独的项目来公开具有常量值的类。这感觉很不对。

答案在 Class structure for a ContentProvider having multiple sub tables似乎暗示选项 (1),这可能看起来是目前最好的选择。

但是,也许我错过了另一种干净整洁的方法?请记住,我是在 PDK 上开发的,我当然希望我的 ContentProvider 能够以与库存 Google 提供程序相同的方式使用。

最佳答案

您可能已经至少有一个类/接口(interface)定义了您的 ContentProvider 的“契约”,使用列名、内容 URI 等的静态常量。

如果您将它放入它自己的 Android SDK 库项目中(只是为了让 Android 类位于构建/类路径上),您就可以从您实际的 SDK/PDK 应用程序的 ContentProvider 使用这个库并将其作为 myapp-api.jar JAR 分发给其他人使用。

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

有关契约(Contract)类的示例,请参阅 ContactsContract .

关于android - 是否有一种 "proper"方法可以将内容提供程序实现与其用户分开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4187476/

相关文章:

java - Android 的英语到印地语音译

Android ContentProvider/Loader 与加载到对象

java - ContentResolver.requestSync 不调用 SyncAdapter

android - 什么时候做 - java.io.FileNotFoundException : No content provider?

android - 如何获取所有联系人的名字,姓氏,电子邮件,电话号码等而不重复

android - 在 AsyncTask 中的 Mysql 中插入数据时出错 android :Android Can't create handler inside thread that has not called Looper. 准备()

android - 覆盖 RelativeLayout 的 onMeasure() 以限制其纵横比

java - 具有 2 种颜色的 ListView 不交错

android - 通过 OpenCV 在 Android 中进行图像比较

android - 为来 self 自己的应用程序的来电提供来电显示