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

Par*_*ani 85 sqlite android android-contentprovider

我已经为Android做了SQLite数据库编程,但我对Content-Provider一无所知,除了这个:"我已经提到了Android开发者页面,Android SDK解释了"Content-provider",因为它用于存储和检索数据."

但是之后,

  1. "Content-Provider"和"SQLite数据库"之间的确切区别是什么?
  2. 什么时候最好存储数据?

任何例子或帮助!!

Par*_*ani 134

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

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

因此,如果您need to share data between applications, you need to use the content provider model as recommended in Android.这篇文章介绍了内容提供程序的基础知识以及如何实现它们.

我在这个链接上找到了这篇文章

提供的信息非常好.

  • 好像链接现在已经死了......再也看不到这篇文章了.如果您再次找到它,想要查看您引用的文章. (2认同)
  • 另一个额外的优点是内容提供者为每个操作使用单个线程,因此多个线程不能像在sqlite情况下那样修改数据库 (2认同)

Com*_*are 53

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

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

什么时候最好存储数据?

这是不可能抽象回答的.一般来说,除非有什么要求你使用a,否则ContentProvider只需使用数据库.

  • 我更喜欢使用ContentProvider,因为它是一个非常好的SQL抽象.您还可以使用CursorAdapter和自动重新查询. (26认同)

zee*_*han 23

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

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

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

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


小智 8

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

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

这样,一次只有一个线程可以访问这些方法.

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

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

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

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

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

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

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


Min*_*amy 5

当您想要跨应用程序共享数据时,将使用内容提供程序.

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