Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 删除每个数据库表的ContentProvider_Android_Design Patterns_Android Sqlite_Android Contentprovider - Fatal编程技术网

Android 删除每个数据库表的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操作期间进行一些良好的检查 但另一方面,添加一个新的数据库表需要编写大量冗余代码——在编写模式之后,我们需要使用不同表

在我的Android项目中,每个数据库表都有一个ContentProvider。 每个ContentProvider都扩展了AbstractContentProvider,AbstractContentProvider具有一些虚拟方法,这些方法可以获取有关数据库表的一些信息,例如表列名。由于这一点,我们可以在每个表ContentProvider的insert/delete/etc操作期间进行一些良好的检查

但另一方面,添加一个新的数据库表需要编写大量冗余代码——在编写模式之后,我们需要使用不同表之间的类似方法创建ContentProvider,并将其添加到清单中


我们希望摆脱这个样板,并能够保留当前的行为。这能做到吗?我们认为应该使用的解决方案是首先将所有ContentProviders权限更改为同一个,并在清单中只注册一个contentProvider,但这显然是不可能的


您是否有其他想法来实现此目标?

理想情况下,您应该使用单个内容提供商并公开多个URI—每个表一个URI


所有URI的CRUD方法的实现都是类似的,并且可以以通用的方式完成。处理多个URI不需要代码重复。原因是SQliteDatabase具有与ContentProvider API参数映射的类似API/参数

我们认为应该使用的解决方案是首先将所有ContentProviders权限更改为同一权限,并在清单中仅注册一个ContentProvider,但这显然是不可能的-确实如此。绝大多数都是这样实施的。您需要为每个表使用不同的Uri结构,例如。,content://.../foo/... 映射到foo表,可能使用UriMatcher。然后,放置在清单中的ContentProvider将自己处理所有内容,或将其委托给其他表对象以执行特定于表的操作。这是ContentProvider的典型实现,它为任何表提供服务,而不事先了解这些表。添加表或修改架构不需要在ContentProvider@CommonsWare-您的意思是每个表在UriMatcher中都有自己的条目,并且有一个大开关负责将UriMatcher值更改为表类对象,负责表特定的操作?由于开关的原因,它听起来并不完美,但无论如何,它比我们现在拥有的要好得多。谢谢是的,这正是我的意思。