Android 删除每个数据库表的ContentProvider
在我的Android项目中,每个数据库表都有一个ContentProvider。 每个ContentProvider都扩展了AbstractContentProvider,AbstractContentProvider具有一些虚拟方法,这些方法可以获取有关数据库表的一些信息,例如表列名。由于这一点,我们可以在每个表ContentProvider的insert/delete/etc操作期间进行一些良好的检查 但另一方面,添加一个新的数据库表需要编写大量冗余代码——在编写模式之后,我们需要使用不同表之间的类似方法创建ContentProvider,并将其添加到清单中Android 删除每个数据库表的ContentProvider,android,design-patterns,android-sqlite,android-contentprovider,Android,Design Patterns,Android Sqlite,Android Contentprovider,在我的Android项目中,每个数据库表都有一个ContentProvider。 每个ContentProvider都扩展了AbstractContentProvider,AbstractContentProvider具有一些虚拟方法,这些方法可以获取有关数据库表的一些信息,例如表列名。由于这一点,我们可以在每个表ContentProvider的insert/delete/etc操作期间进行一些良好的检查 但另一方面,添加一个新的数据库表需要编写大量冗余代码——在编写模式之后,我们需要使用不同表
我们希望摆脱这个样板,并能够保留当前的行为。这能做到吗?我们认为应该使用的解决方案是首先将所有ContentProviders权限更改为同一个,并在清单中只注册一个contentProvider,但这显然是不可能的
您是否有其他想法来实现此目标?理想情况下,您应该使用单个内容提供商并公开多个URI—每个表一个URI
所有URI的CRUD方法的实现都是类似的,并且可以以通用的方式完成。处理多个URI不需要代码重复。原因是SQliteDatabase具有与ContentProvider API参数映射的类似API/参数我们认为应该使用的解决方案是首先将所有ContentProviders权限更改为同一权限,并在清单中仅注册一个ContentProvider,但这显然是不可能的-确实如此。绝大多数都是这样实施的。您需要为每个表使用不同的Uri结构,例如。,content://.../foo/... 映射到foo表,可能使用UriMatcher。然后,放置在清单中的ContentProvider将自己处理所有内容,或将其委托给其他表对象以执行特定于表的操作。这是ContentProvider的典型实现,它为任何表提供服务,而不事先了解这些表。添加表或修改架构不需要在ContentProvider@CommonsWare-您的意思是每个表在UriMatcher中都有自己的条目,并且有一个大开关负责将UriMatcher值更改为表类对象,负责表特定的操作?由于开关的原因,它听起来并不完美,但无论如何,它比我们现在拥有的要好得多。谢谢是的,这正是我的意思。