私有内容提供者的用途是什么?

44

Android Dev Guide指出:

内容提供程序还可用于读取和写入应用程序私有且不共享的数据。

通常情况下,内容提供程序用于为不同的应用程序提供数据或在它们之间共享数据。我想知道是否有使用私有提供程序并不想分享的用途?相对于直接访问数据库或文件系统,是否提供任何优势?

谢谢, Rajath

2个回答

78
  1. 它会自动将所有的服务器端和同步数据库访问调度到后台线程中。但是在应用程序前端,内容解析器/提供程序通常会默认在UI线程上执行查询/事务。您必须异步执行所有事务(即使用CursorLoader),以确保您的应用程序在UI方面运行流畅。
  2. 它从通过ContentProvider访问的任何线程本地化可重入的DB访问,因此所有锁定都可以完全发生在您的ContentProvider覆盖调用中,而无需在数据库层、服务层和UI层中进行跟踪。
  3. 作为上述功能的一部分,它还提供了一个不错的数据单例接口——如果您的应用程序中有十个Activity类,您只需要通过每个Activity的ContentResolver静态调用即可,而不需要在应用程序中从一个Activity跳转到另一个Activity时处理打开/关闭SQLiteDatabase。
  4. ContentProvider与SyncAdapter模型密切相关,这意味着如果您想将您的数据库与网络上托管的服务器数据库同步,那么ContentProvider几乎是唯一的选择。(您的应用程序类似于REST api类型的情况)
  5. 它与ContentResolver的ContentObserver接口相结合——这是一个接口,在其中(除了许多其他有用的事情)一个视图可以注册为观察特定的数据(通过该数据的光标)。然后,如果您向ContentProvider提交更改,CP可以通知CR,CR可以反过来通知任何相关的光标,这将会重新查询并导致视图更新。这比手动跟踪视图以便使其失效和重绘要干净得多。

至于数据库的可重入锁定,它没有完全实现,但是有助于解决此问题——您的ContentProvider类实现了四个简单函数(CRUD接口),如果您选择覆盖它,则可以实现第五个批处理函数batchAdd()。这将本地化您的锁定。最简单的答案是仅在函数级别上将这四个/五个函数声明全部“同步化”,然后就完成了。这比尝试从访问您的DB的20个位置中的5个不同Activity中弄清楚锁定要容易得多。


2
感谢jcwenger抽出时间将它们列得如此清晰明了。那是非常有用的信息。 - Rajath
大多数观点都是正确的,但它真的有助于您进行线程处理(第一点)吗?您仍然需要将对ContentProvider的访问卸载到不同的线程中。 - Jan Berkel
@JanBerkel:对于你来说,它处理起来更或多或少是'自动的'。ContentProvider / Query / Cursor / ContentObserver 模型将数据库访问的实际线程隐藏起来。程序上,您永远不必考虑启动线程或担心锁定或等待线程完成。因此,我想我的观点是,它把后台线程的细节抽象到一个看起来单线程的接口中。 - jcwenger
@jcwenger 嗯,如果您没有做任何特殊处理,从主线程访问任何内容提供程序仍将停留在主线程上,没有自动调度。 - Jan Berkel
如果您使用单个SQLiteDatabase实例,那么您不需要同步锁定,因为它已经在内部管理锁定。 - Karakuri
显示剩余3条评论

1
例如,多进程应用程序使用场景(例如:音乐播放服务通常在远程进程中运行),在同一应用程序中共享数据库的两个进程之间应该使用私有ContentProvider。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接