我了解内容提供商允许在应用程序之间公开共享数据。但是,我想知道是否有人想过让内容提供商只在你自己的应用程序中使用。这样做有什么好处吗?有什么缺点?
过去我刚刚实现了SQliteOpenHelper来访问我的数据库中的数据,但我正在考虑创建一个Content Provider。我觉得请求数据的URI方法简洁明了。另一方面,仅为我的应用程序使用内容提供程序是多余的(因为在其中我将有一个SQliteOpenHelper类)和比我需要的更多工作?
答案 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
有助于有效管理您的数据。我建议使用它们的原因如下。
SyncAdapter
等其他 android框架类很好地配合。例如,当数据库中的值使用ContentProviders和CursorLoader
进行更改时,您可以自动刷新列表。如果没有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)。 (我在一些解决方案中使用了内容提供商,并提供了实时“快照”操作值以进行调试和测试的功能。)