何时使用内容提供者

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

在过去,我刚刚实现了SQliteOpenHelper来访问我的数据库中的数据,但是我正在考虑创build一个Content Provider。 我觉得URI的方式来请求数据是清晰和简洁的。 另一方面,仅仅为我的应用程序使用内容提供程序是多余的(因为在其中,我将有一个SQliteOpenHelper类)和更多的工作比我需要?

如果您不打算共享数据,请不要考虑内容提供商。 他们是强大的,但很难写,如果你打算在内部使用它们将是愚蠢的。

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

当然…例如,我写了一个旧的TODO列表应用程序,我不得不编写一个内容提供程序,以允许其他应用程序检索和访问任务状态。 这是要求的一部分,但更重要的是它有意义,使应用程序更好。

我认为即使你不打算公开它,使用ContentProvider也是一个好主意。

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

此外,您将来总有可能希望公开您的数据。 如果您ContentProvider不使用ContentProvider ,稍后将难以加装。

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

总的来说,在写一个ContentProvider时候,一开始就没有什么额外的开销(一旦你已经学习了API,这是一个好主意),所以这样做是有道理的,甚至对于私人数据也是如此。

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

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

以下是一个场景,您可能在数据库中有5个表格,但是在使用它们之前,您需要按照特定的顺序join其中的一些表格。 并为这些连接中的每一个build立内容URI。 你可以每个使用这些URI作为表:)

我build议你继续与内容提供商,你会惊讶地看到它是多么强大。

简而言之, Content Providers有助于有效pipe理您的数据 。 我build议使用它们的原因如下。

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

所以即使你现在不需要任何这些function,你今后可能还需要它们,现在它还有很多额外的工作要做。

在我看来,内容提供商具有很多优势,仅仅与其他应用程序共享数据。 如果您需要使用同步适配器与服务器同步,请使用Google云消息传递,使用Loaders在数据库中更改底层数据时自动更新UI,实现search,使用小部件…然后内容提供商为您提供帮助。

我更喜欢遵循这个指导原则,因为有一天你可能需要实现一些附加到内容提供者的上述function

顺便说一句,您可以使用内容提供程序生成器在5分钟内快速构build数据库和CP

如文档中所述: 创build内容提供者

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

那么为什么还要花费这些开销呢? 你想更容易和更快的发展,对不对? 所以一层抽象(SQLiteOpenHelper后裔)就足够了。

见奥卡姆的剃刀不要没有很好的理由做一个实体。

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