2011-02-08 109 views
90

我知道内容提供商允许在应用程序之间公开共享数据。不过,我想知道是否有人想让内容提供商只在您自己的应用程序中使用。这样做会有什么好处吗?有什么缺点?何时使用内容提供商

在过去,我刚刚使用SQliteOpenHelper从我的数据库访问数据,但我正在考虑创建一个Content Provider。我觉得URI请求数据的方法是清晰和简洁的。另一方面,仅仅为我的应用程序使用内容提供程序会是多余的(因为在它内部,我将拥有一个SQliteOpenHelper类),而且比我需要更多的工作?

+2

我做了一个库,使内容提供商易于编写。 比写简单的SQLiteOpenHelper更容易。 https://github.com/coocood/VContentProvider – coocood 2012-12-10 01:25:48

回答

50

如果您不打算共享数据,请不要考虑内容提供商。它们功能强大但很难编写,如果要在内部使用它们,实施它们将会很愚蠢。

但是,我想知道是否有人想让内容提供商只在您自己的应用程序中使用。

当然......例如,对于一个老待办事项清单应用程序我写的,我不得不写一个内容提供商,让其他应用检索和访问任务的状态。这是要求的一部分,但更重要的是它有意义,并使应用程序更好。

+34

我同意您的理由,但我也认为这对于一旦实施内容提供商后很重要(对初学者尤其如此),您将获得很多好处。例如,您可以使用`CursorLoader`来执行异步查询...您可以访问单例实例(ContentResolver)来执行查询等。当然,您可以实现自己的Loader以用于SQLite数据库......当然,您可以在整个应用程序中实现对单个数据库实例的访问...当然,除非您想与其他应用程序共享 – 2012-06-27 18:32:17

+10

数据,否则不需要ContentProvider。也就是说,实现自己的Content Provider有很多好处,所以你不应该因为你的应用不共享它的数据而忽略它。 – 2012-06-27 18:34:15

+7

是的,你是完全正确的,但我仍然认为它在大多数情况下都不值得。我已经完成了至少12个不同的Android应用(发布到Play商店),并且从不需要“ContentProvider”。实际上,我们正在开发的最后一个应用程序最初是用一个`ContentProvider`制作的,我们只是删除了它,因为它实际上比使用它更麻烦(我甚至写了一个库来使它更容易实现基本的`ContentProvider`s:https://github.com/casidiablo/persistence但从未使用它我自己的XD)。 – Cristian 2012-06-27 22:25:53

7

看看MOTODEV Studio for Eclipse。这是一个扩展Eclipse的开发环境。他们有一个工具,您可以自动为数据库生成内容提供者。如果内容提供商更容易访问您的数据,并且不会对性能产生重大影响,请继续使用它。在大多数情况下,情况就是这样。

109

我认为使用ContentProvider绝对是一个好主意,即使您不打算公开。

为您的数据提供额外的抽象级别以便更易于在内部进行更改是一种很好的做法。如果您决定稍后更改底层数据库结构会怎么样?如果使用ContentProvider,则可以包含其中的所有结构更改,如果不使用它,则必须更改受结构更改影响的代码的所有区域。此外,能够重复使用相同的标准API来访问数据,而不是通过对数据库的低级访问来乱抛垃圾的代码是很好的。

此外,您总有可能希望将来公开您的数据。如果您事先不使用ContentProvider,那么在以后更新它将会困难得多。

然后,还有其他需要/推荐ContentProvider的Android版本,例如使用SyncAdapter时,以及是否需要一个涉及数据访问的App Widget。

总的来说,在写一个ContentProvider(前提是你已经学习API了,这是一个好主意),所以这样做很有意义,即使对于私人数据也是如此。

4

我同意内容提供者有点难以掌握,但他们肯定是有帮助的,即使你想在你的内部为你自己的应用程序使用它们。关于它的最好的事情是,您可以自定义内容提供商以获取合适的URI。

这里有这样一个场景,你可能在你的数据库5桌,但你需要在使用前加入他们几个在某些命令。并为这些连接中的每一个建立一个内容URI。然后,您可以使用每一个这些URI为表:)

我建议你继续与内容提供商,你会惊讶地发现它是多么的强大。

-1

如果不希望与其他应用程序共享数据,请勿使用内容提供程序。使用简单的sqlitedatabase来执行数据库操作。要小心,同时使用内容提供商存储的机密数据,因为您的机密信息可能被其他应用程序

2

在我的观点进行访问,内容提供者配备了充足的优势独自离开只是与其他应用程序共享数据。如果您需要使用同步适配器与服务器同步,请使用Google云消息传递,使用Loaders在数据库中更改底层数据时自动更新UI,实现搜索,使用小部件...然后内容提供商将为您提供帮助。

我更喜欢你遵循因为有一天你可能需要实现一些附加到内容提供商

顺便说上面的功能,可以快速构建你的数据库和CP在不到5指引使用content provider generator

0

随着分钟,文件说: Creating a Content provider

您不需要提供程序来使用SQLite数据库,如果使用是完全 自己的应用程序中。

何必制定这方面的开销?你想更容易和更快的发展,对吧?所以一层抽象(SQLiteOpenHelper后裔)就足够了。

Occam's Razor 没有很好的理由不要让一个实体。

2

总之,Content Providers帮助有效管理您的数据。我建议使用它们的原因如下。

  • 它充当您的UI和数据库之间的抽象层。您可以在ContentProviders中实施数据验证以验证用户输入的数据。它还可以让你在不触及UI和其他部分的情况下修改数据库的结构的
  • 他们一起玩很好地与其他Android框架类SyncAdapter。例如,当数据库中的值使用ContentProvider与CursorLoader一起更改时,您可以自动刷新列表。如果没有ContentProvider,你必须自己实现许多这样的功能。
  • 我们可以安全地将我们的私人数据暴露给其他应用程序。使用ContentProviders将使我们能够轻松安全地与其他应用程序共享我们的数据。

因此,即使您现在不需要任何这些功能,您将来也可能需要它们,并且很高兴能够继续努力,并且现在就可以实施它们。