我已经为Android完成了SQLite数据库编程,但是除以下内容外,我对Content-Provider一无所知:“当我提到Android开发人员页面时,Android SDK解释了“ Content-provider”,因为它用于存储和检索数据。”
但是之后,
- “ Content-Provider”和“ SQLite Database”之间的确切区别是什么?
- 什么时候最好存储数据?
任何例子或帮助!
我已经为Android完成了SQLite数据库编程,但是除以下内容外,我对Content-Provider一无所知:“当我提到Android开发人员页面时,Android SDK解释了“ Content-provider”,因为它用于存储和检索数据。”
但是之后,
任何例子或帮助!
Answers:
我发现一个主要区别如下:
将数据存储在数据库中是保留数据的一种好方法,但是Android中有一个警告:在Android中创建的数据库visible
仅适用于创建它们的应用程序。也就是说,一个应用程序在Android上创建的SQLite数据库只能由该应用程序使用,而不能由其他应用程序使用。
因此,如果您有need to share data between applications, you need to use the content provider model as recommended in Android.
这篇文章,将介绍内容提供程序的基础知识以及如何实现它。
我在此链接上找到了这篇文章
提供的信息真不错。
我已经用数千个使用简单的SQLite方法的用户制作了许多优秀的应用程序。但这是前一段时间,我不得不手动编写许多代码,现在ContentProvider可以轻松地处理它们。那时我不赞成使用Content Providers,因为它似乎只会增加代码的复杂性。
但是,最近几年,随着Android的发展,我已经迁移到ContentProvider,因为它可以节省时间并允许您做更多的事情。我现在广泛使用它。一旦编写了Content Provider类,您的生活就会变得更加轻松。使用ContentProvider,我可以轻松地处理游标加载器,加载器回调和批量插入,过去我不得不为它们手动编写所有内容,但仍然无法高效地工作。尤其是在更新列表视图时,由于只有一个notifychange()方法,列表视图现在可以自动更新。这意味着现在我不必键入自己的侦听器,也无需手动更新列表视图和适配器中的内容。另外,我不必担心数据库的打开和关闭或内存泄漏的问题。全部由内容提供者处理。我偶尔遇到的唯一问题是,您无法在ContentProviders中进行一些复杂的查询。在这种情况下,您仍然可以使用原始查询,并与sqlite使用老式的手动交互。
如果您以前已经编写了自己的DbAdapter,Helper和Observer,则可以安全地将它们带到新的应用程序上,而无需花费时间将所有内容都转换为ContentProvider。但是根据我的经验,我强烈建议您转到ContentProvider。习惯它需要一些时间,但是一旦您有了经验,就可以继续使用它。
2017年更新 我现在切换到Realm,这是在任何平台上使用数据库的更好方法。花几个小时来学习它,并在您的应用程序开发生涯中节省无数小时。
默认情况下,内容提供者不是线程安全的。如果您使用内容提供程序有多个线程,则可以看到引发了许多不同的异常以及其他数据不一致的情况。解决此问题的最简单方法是在内容提供商公开的每个公共方法上使用synced关键字。
这样,一次只能有一个线程可以访问这些方法。
我需要在新的Serval Maps应用程序中将数据从二进制文件导入到应用程序内部使用的数据库中。为了做到这一点,并与其余的应用程序很好地配合,最好执行以下操作:
产生一个新线程来进行导入,这样不会对其他线程造成不利影响,尤其是负责更新UI的线程;在每次导入的末尾短暂地暂停和暂停,以提供需要更多使用同步方法的其他线程的机会。
Android中的内容提供者的工作方式是在代码的其余部分和基础数据库之间提供抽象层。据我所知,这主要是由于事实,内容提供商可以从数据库以外的地方访问数据。
这意味着您不能在基础数据库上执行原始SQL查询,而需要使用传递给各种方法(例如查询方法)的变量来指定SQL查询的各种组件。如果您的任务不适合内容提供者处理SQL的方式,则有两个选择:
从侧面考虑该查询,也许您可以通过替代查询并从游标访问结果来获取所需的数据;并使用URI正常访问数据,并使用与特定查询匹配的特殊URI,以应对那些没有替代选择的任务。
当您要在应用程序之间共享数据时,将使用内容提供程序。
如果您的数据库附加了一个应用程序,并且您希望另一个应用程序使用某些数据,则可以实现一个内容提供程序以公开该数据
主要区别在于:当您的应用程序需要与其他应用程序共享信息时,请使用Content-Provider。SQLite仅存储创建它的应用程序的数据
区别之一是内容提供者具有对内容观察者的平台支持。您将需要为SQLite数据库实现自己的Observable模式。