“Content-Provider”和“SQLite数据库”之间的确切区别

时间:2010-07-28 06:30:26

标签: android sqlite android-contentprovider

我为Android做过SQLite数据库编程,但我对此一无所知 内容提供商除此之外:“正如我已提及Android Developer page ,Android SDK解释了”内容提供商“,因为它用于存储和检索数据。”

但是,

  1. “Content-Provider”和“SQLite数据库”之间的确切区别是什么?
  2. 什么时候最好存储数据?
  3. 任何示例或帮助!!

9 个答案:

答案 0 :(得分:132)

我发现了一个主要区别,如下:

将数据存储在数据库中是保存数据的一种好方法,但在Android中创建的Android数据库中有一个警告只有 visible 到创建它们的应用程序。也就是说,一个应用程序在Android上创建的SQLite数据库只能由该应用程序使用,而不能由其他应用程序使用。

因此,如果您 need to share data between applications, you need to use the content provider model as recommended in Android. 本文介绍内容提供商的基础知识以及如何实施内容提供商。

我在此link

找到了这篇文章

提供了非常好的信息。

答案 1 :(得分:53)

  

之间的确切区别是什么   “Content-Provider”和“SQLite   数据库“?

ContentProvider是一个外观 - 您可以实现的API,它将数据库公开给其他进程。 可以以数据存储在SQLite数据库中的方式实现,但不一定是这样。

  

什么时候最好存储数据?

这是不可能抽象回答的。一般来说,除非要求您使用ContentProvider,否则只需使用数据库。

答案 2 :(得分:23)

我已经制作了许多优秀的应用程序,成千上万的用户使用它们只使用了SQLite方法。但那是一段时间以前我不得不手动编写大量代码,现在ContentProvider可以很容易地处理这些代码。当时我并不赞成使用内容提供商,因为它似乎只会增加代码的复杂性。

然而,在过去几年中,随着Android的发展,我已经转移到ContentProvider,因为它可以节省时间并允许您做更多事情。我现在广泛使用它。一旦编写了Content Provider类,您的生活就会变得更加容易。使用ContentProvider,我可以很容易地处理Cursor Loaders,Loader Callbacks和Bulk Inserts,我必须在过去手动编写所有内容,但它仍无法正常工作。特别是在更新列表视图时,由于只有一个notifychange()方法,因此现在可以自动更新。这意味着现在我不必键入自己的侦听器并手动更新列表视图和适配器中的内容。另外,我不需要担心打开和关闭数据库或担心内存泄漏。这些都由内容提供商处理。我偶尔遇到的唯一问题是你不能在ContentProviders中做一些复杂的查询。在这种情况下,您仍然可以使用原始查询并使用与sqlite的旧式手动交互。

如果您之前已经编写了自己的DbAdapter,Helper和Observer,则可以安全地将它们运行到新应用程序,而无需花时间将所有内容转换为ContentProvider。但根据我的经验,我强烈建议转到ContentProvider。它需要一些时间来适应它,但是一旦你有了它的经验,你就会坚持下去。

2017年更新 我现在已切换到 Realm ,这是在任何平台上使用数据库的更好方法。花几个小时学习它,在你的应用开发生涯中节省无数个小时。

答案 3 :(得分:8)

1。内容提供商不是线程安全的

默认情况下,内容提供程序不是线程安全的。如果您有多个线程使用内容提供程序,您可以看到抛出许多不同的异常和其他数据不一致。解决此问题的最简单方法是在内容提供程序公开的每个公共方法上使用synchronized关键字。

通过这种方式,一次只能有一个线程访问这些方法。

2。做大量写操作时玩得很好

我需要在新的Serval Maps应用程序中将数据从二进制文件导入到应用程序内部使用的数据库中。为了做到这一点并与应用程序的其余部分一起使用,最好:

生成一个新线程进行导入,以便其他线程不会受到负面影响,特别是负责更新UI的线程;和 在每次导入结束时暂时暂停,以便为需要使用synchronized方法的其他线程提供更多机会。

3。内容提供商迫使你有时候横向思考

Android内容提供商的工作方式是在其余代码和底层数据库之间提供一层抽象。这主要是因为据我所知,内容提供商可以从数据库以外的地方访问数据。

这意味着您无法在底层数据库上执行原始SQL查询,并且需要使用传递给各种方法(如查询方法)的变量来指定SQL查询的各种组件。如果您的任务不符合内容提供者处理SQL的方式,您有两个选择:

横向思考查询,也许您可​​以通过替代查询获取所需的数据并从游标访问结果;和 使用URI正常访问数据,使用特殊URI与特定查询匹配,以查找没有替代项的任务。

答案 4 :(得分:5)

当您希望跨应用程序共享数据时,将使用内容提供程序。

如果您的数据库附带了应用程序,并且您希望其他应用程序使用某些数据,则可以实现公开数据的内容提供程序

答案 5 :(得分:3)

主要区别在于:当您的应用需要与其他应用共享信息时,请使用Content-Provider。仅限SQLite创建它的应用程序的存储数据

答案 6 :(得分:3)

我在寻找同样的疑问的同时阅读this answer,所以想到分享它。 它说 -

  

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

因此,使用内容提供商是个好主意。

答案 7 :(得分:3)

考虑高级内容管理系统。每个对象(页面,图像,新闻文章,事件项等)都具有内容,地址,用户权限以及从系统的不同部分与其进行交互的方式。内容提供商为Android执行此操作。您现在可以共享存储在应用程序中的文件或图像。您还可以创建自定义可共享对象,例如业务联系人,可编辑备注等。并指定安全性和默认应用程序,以便在从任何其他应用程序打开它们时处理此类对象。

答案 8 :(得分:1)

一个区别是内容提供商对内容观察者有平台支持。您将需要为SQLite数据库实现自己的Observable模式。

How to automatically re-query with LoaderManager

ContentObserver for SQLite?