Android 多个ContentProvider使用单个SQLiteOpenHelper的最佳实践

Android 多个ContentProvider使用单个SQLiteOpenHelper的最佳实践,android,android-contentprovider,sqliteopenhelper,Android,Android Contentprovider,Sqliteopenhelper,在我的应用程序(SyncAdapter)中,我包含了许多供其他应用程序使用的ContentProviders,我想知道在它们之间共享一个SQLiteOpenHelper实例是否合适?如果是,怎么做 如果这不合适,在每个ContentProvider的onCreate方法中重复SQLiteOpenHelper的实例化(如示例所示)是否正确;看来应该有更好的办法 清单中是否有足够的信息供操作系统实例化ContentProviders而不首先创建其包含的应用程序?如果是这样,那么我就不能在一个扩展应用

在我的应用程序(SyncAdapter)中,我包含了许多供其他应用程序使用的ContentProviders,我想知道在它们之间共享一个SQLiteOpenHelper实例是否合适?如果是,怎么做

如果这不合适,在每个ContentProvider的onCreate方法中重复SQLiteOpenHelper的实例化(如示例所示)是否正确;看来应该有更好的办法

清单中是否有足够的信息供操作系统实例化ContentProviders而不首先创建其包含的应用程序?如果是这样,那么我就不能在一个扩展应用程序以供ContentProviders检索的类中保存静态SQLiteOpenHelper


救命啊

答案是将我的ContentProviders合并到一个单一的ContentProvider中,该ContentProvider可以处理我的各种URI/表;这是谷歌自己的一份报告。通过这种方式,您可以实例化SQLiteOpenHelper,并将其设置为重写方法要使用的字段,再次参见示例。顺便说一句,我从代码中获得的另一个好模式(为了最佳实践的利益)是:重写applyBatch,将它所做的一切打包到事务中。此后,只要您想进行任何持久化,就使用它并仅使用它(通过.ContentProviderOperations);如果这样做,您可以从实际重写的更新、删除和插入方法中忽略事务,因为您不会直接使用它们!后者对我很有吸引力,因为它简化了插入、更新和删除方法,并确保在抛出异常时可以轻松回滚整个相关更改序列。

为什么需要许多contentproviders来访问1个数据库?(应用程序总是首先创建的,并且总是存在于活动、服务、广播接收器和内容提供者中)大体上说,我在数据库中的每个表中都有一个内容提供者。你怎么知道android首先创建了应用程序呢?因为应用程序类的文档就是这么说的。声明:“在应用程序启动时,在创建任何活动、服务或接收者对象(不包括内容提供商)之前调用。”这让我感到困扰,也许它只是用了一种含糊不清的措辞?因此,我想一个答案是将所有内容塞进一个巨大的内容提供商中,以管理所有内容,就像谷歌在这里做的那样:够有趣了,这对我没有吸引力!