何时使用内容提供商

时间:2011-02-08 18:15:26

标签: android android-contentprovider

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

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

9 个答案:

答案 0 :(得分:114)

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

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

此外,您可能希望将来公开您的数据。如果你没有预先使用ContentProvider,那么以后更难改装它。

然后,还有Android的其他部分需要/推荐ContentProvider,例如使用SyncAdapter时,如果你想要一个涉及数据访问的App Widget。

总之,预先编写ContentProvider(一旦你学会了API这是一个好主意)所涉及的开销非常小,所以这样做是有意义的,即使对于私有数据也是如此。 / p>

答案 1 :(得分:54)

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

  
    

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

  

当然......例如,对于我写的旧TODO列表应用程序,我必须编写内容提供程序以允许其他应用程序检索并访问任务状态。这是要求的一部分,但不仅仅是它有意义并使应用程序更好。

答案 2 :(得分:7)

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

答案 3 :(得分:4)

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

在这种情况下,您的数据库中可能有5个表,但在使用它们之前,您需要按特定顺序加入其中一些表。并为每个连接创建一个内容URI。然后,您可以将这些URI用作表格:)

我建议您继续使用内容提供商,您会惊讶地发现它有多强大。

答案 4 :(得分:4)

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

  • 它充当您的UI和数据库之间的抽象层。您可以在ContentProviders中实施数据验证,以验证用户输入的数据。它还允许您修改数据库的结构,而无需触及UI和其他部分。
  • SyncAdapter等其他 android框架类很好地配合。例如,当数据库中的值使用ContentProviders和CursorLoader进行更改时,您可以自动刷新列表。如果没有ContentProviders,您必须自己实现许多这样的功能。
  • 我们可以安全地将我们的私人数据公开给其他应用。使用ContentProviders可以让我们轻松安全地与其他应用共享数据。

因此,即使您现在不需要任何这些功能,将来也可能需要它们,并且现在可以加倍努力并实施它们。

答案 5 :(得分:2)

在我看来,内容提供商具有很多优势,只需与其他应用共享数据。如果您需要使用同步适配器与服务器同步,请使用谷歌云消息传递,当数据库中的基础数据使用加载器更改时自动更新UI,实现搜索,使用小部件...然后内容提供商适合您。

我更喜欢您遵循指南,因为有一天您可能需要实施内容提供商附带的上述某些功能

顺便说一句,您可以使用content provider generator

在不到5分钟的时间内快速构建数据库和CP

答案 6 :(得分:1)

如文件中所述: Creating a Content provider

  

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

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

参见Occam's Razor 不要没有充分理由做出实体。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

使用内容提供者可以帮助提高抽象级别-将其放在您自己的应用程序中可以为您的项目增加大量的开发时间。但是,如果您要使用它在多个应用程序之间共享数据,应用程序设置或配置,则可以选择内容提供程序。

请注意您的安全级别,如果您的内容提供者正在写入SQLite,我建议您使用SQLcipher加密重置数据(DAR)。 (我在一些解决方案中使用了内容提供商,并提供了实时“快照”操作值以进行调试和测试的功能。)