android sqlite provider,android - “Content-Provider”和“SQLite数据库”之间的确切区别...

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

我已经为Android完成了SQLite数据库编程,但我对此一无所知内容提供商除此之外:“正如我已经提到Android开发者页面,Android SDK解释了”内容提供商“,因为它用于存储和检索数据。”

但是之后,

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

什么时候最好存储数据?

任何例子或帮助!!

9个解决方案

131 votes

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

将数据存储在数据库中是保存数据的一种好方法,但在Android中创建的Android数据库中的一个警告仅为创建它们的应用程序need to share data between applications, you need to use the content provider model as recommended in Android.。 也就是说,一个应用程序在Android上创建的SQLite数据库只能由该应用程序使用,而不能由其他应用程序使用。

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

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

提供的信息非常好。

Paresh Mayani answered 2019-09-16T14:29:30Z

53 votes

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

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

什么时候最好存储数据?

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

CommonsWare answered 2019-09-16T14:30:12Z

23 votes

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

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

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

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

zeeshan answered 2019-09-16T14:31:05Z

8 votes

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

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

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

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

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

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

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

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

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

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

chanu answered 2019-09-16T14:32:36Z

5 votes

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

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

Mina Samy answered 2019-09-16T14:33:09Z

3 votes

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

daniel uribe ayvar answered 2019-09-16T14:33:34Z

3 votes

我在寻找同样的疑问时读到了这个答案,所以想到分享它。它指出 -

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

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

Darpan answered 2019-09-16T14:34:13Z

3 votes

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

Roberto answered 2019-09-16T14:34:39Z

1 votes

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

如何使用LoaderManager自动重新查询

SQLite的ContentObserver?

user1538028 answered 2019-09-16T14:35:18Z

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值