“内容提供商”和“SQLite数据库”之间准确的区别

问题描述 投票:83回答:9

我已经做了SQLite数据库编程的Android,但我不知道这只是内容提供商什么:“因为它是用来存储和检索数据的‘内容提供商’正如我刚才提到Android Developer page ,Android SDK中有关解释”

但是之后,

  1. 什么是“内容供应商”和“SQLite数据库”之间的确切区别?
  2. 这是最好的存储数据,什么时候?

任何例子或者帮助!

android sqlite android-contentprovider
9个回答
133
投票

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

在数据库中存储你的数据是坚持你的数据的一种好方法,但有一个在Android中创建Android的数据库的一个警告是visible只对创建它们的应用程序。也就是说,通过一个应用程序在Android上创建一个SQLite数据库是可用的只有该应用程序,而不是由其他应用程序。

所以,如果你need to share data between applications, you need to use the content provider model as recommended in Android.本文介绍了内容提供商的基础知识,以及如何实现一个。

我发现这篇文章在这个link

真的很好的信息提供。


53
投票

什么是“内容供应商”和“SQLite数据库”之间的确切区别?

ContentProvider是一个门面 - 一个API,你可以实现一个公开的数据库给其他进程。它可以在数据存储在SQLite数据库的方式来实现,但它并没有要。

这是最好的存储数据,什么时候?

那是不可能抽象地回答。一般来说,除非事情是需要你使用ContentProvider,只使用一个数据库。


23
投票

我已经提出了很多好的应用程序与成千上万使用他们简单地使用SQLite的方法的用户。但是,这是前一段时间,我不得不手动编写大量的现在可以很容易地通过ContentProvider的照顾代码。当时我并不赞成使用内容提供商,因为它似乎只在添加代码的复杂性。

然而,对于过去的几年里,由于Android的发展,我已经因为它节省了时间,并允许你做更多的转移到ContentProvider的。我现在用它广泛。一旦你有一个内容提供商类写的,你的生活变得更加容易。随着ContentProvider的,我可以多轻松应对光标装载机,回调和批量插入为此我不得不在过去的手工编写的一切,它仍然没有为提高工作效率。特别是更新所述列表视图,其现在自动更新由于只有一个有NotifyChange()方法时。这意味着,现在我不必键入自己的听众和手动更新列表视图和适配器的内容。另外,我并不需要担心的数据库打开和关闭,也不用担心内存泄漏。这是全部由内容提供商来处理。曾经在一段时间,我面对的唯一的问题是,你不能做ContentProviders一些复杂的查询。在这种情况下,你仍然可以使用原始查询和使用的SQLite老式的手动交互。

如果您之前已经编写了自己将对DBAdapter,助手和观察,你可以放心地带着它们到您的新的应用程序,无需花费时间的一切转化为ContentProvider的。但根据我的经验,我会强烈建议迁移到的ContentProvider。这将需要一些时间来适应它,但一旦你有经验,你就会坚持下去。

UPDATE 2017年我现在已经切换到境界,一个更好的方法在任何平台上使用的数据库。花几个小时来学习它,并保存无数的时间在你的应用程序的开发事业。


8
投票

1. Content Providers are not Thread Safe

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

这样,仅在一个时间一个线程可以访问这些方法。

2. Play nice when doing lots of writes

我在新薮猫地图应用程序需要进口从二进制文件数据到应用程序内部使用的数据库。为了做到这一点,发挥好与应用程序的其余部分最好是:

产生一个新的线程承接进口,以便其他线程不会受到不利影响,特别是在负责更新UI的线程;并在每次导入结束稍停片刻,得到需要使用同步方法更多的是机会的其他线程。

3. Content providers force you to think laterally sometimes

的方式,在Android的工作内容提供商是你的代码的其余部分和底层数据库之间提供了一个抽象层。这主要是由于这样的事实,据我所知,内容提供商可以从数据库中比其他地方访问数据。

这意味着你不能在底层数据库上执行原始的SQL查询,你需要指定使用传递给各种方法变量的SQL查询的各个部件,如查询方法。如果您有不适合该SQL由内容提供商处理方式的任务,则有两种选择:

横向想想查询,也许你可以得到的数据,你需要通过其他的查询和访问从游标的结果;并使用URI进行正常访问数据,并匹配于一个特定的查询没有替代这些任务的特殊URI。


5
投票

当你想在应用程序之间共享数据内容提供商使用。

如果连接与应用程序数据库,并且希望其他应用程序中使用一些数据,你可以实现一个公开的数据内容提供商


3
投票

主要的区别是:当您的应用程序需要共享信息到另一个应用程序,使用内容提供商。对于谁创建它的应用程序的SQLite只存储数据


3
投票

我读this answer同时寻找同样的怀疑,所以想到了分享。它指出 -

这是一种很好的做法抽象您的数据的额外级别,使其更容易从内部改变。如果你决定什么在以后的时间来改变底层数据库的结构?如果您使用ContentProvider的,你可以在其中包含所有的结构性变化,在这里,如果你不使用一个,你不得不改变了由结构性变化影响的代码的所有领域。此外,它很高兴能够重新使用相同的标准API访问数据,而不是低级别的访问数据库乱抛垃圾代码。

因此,使用内容提供商将是一个不错的主意。


3
投票

想想先进的内容管理系统。每个对象(网页,图片,新闻文章,活动项目等)所具有的内容,地址,用户权限,以及如何从系统的不同部分与它进行交互。内容提供商做的Android。现在,您可以共享文件,或者您可能已存储在您的应用程序的图像。您还可以创建自定义的共享对象,像经营业务联系人,编辑的注意事项等,并指定安全和默认的应用程序,当您从任何其他应用程序中打开他们处理这样的对象。


1
投票

一个区别是,内容提供商对内容观察员平台的支持。你将需要实现自己的可观测模式的SQLite数据库。

How to automatically re-query with LoaderManager

ContentObserver for SQLite?

© www.soinside.com 2019 - 2024. All rights reserved.