44

Android开发指南

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

通常,Content Providers 用于向不同的应用程序提供数据或在它们之间共享数据。我想知道拥有私人提供商并且不想分享它是否有任何用处。如果直接访问数据库或文件系统没有提供任何好处?

谢谢, 拉贾特

4

2 回答 2

78
  1. 它会自动在后台线程中安排所有服务器端和同步数据库访问。但是,在您的应用程序前端,Content Resolver/Provider 通常会默认从 UI 线程执行查询/事务。您必须异步执行所有事务(即使用 a CursorLoader)以确保您的应用程序在 UI 端顺利运行
  2. 它本地化来自通过 访问的任何线程的可重入 DB 访问ContentProvider,因此所有锁定都可以完全发生在您的 ContentProvider 覆盖调用中,而不是在 DB 层、服务和 UI 层中跟踪它。
  3. 作为上述的一部分,它还为您的数据提供了一个很好的单例接口——如果您的应用程序中有十个 Activity 类,您只需从每个类中进行 ContentResolver 静态调用,而不是需要处理打开/关闭 SQLiteDatabase当您在应用程序中从一个活动跳到另一个活动时,每个活动。
  4. ContentProvider 与 SyncAdapter 模型紧密相关——这意味着如果您想让您的数据库与网络上的服务器托管数据库保持同步,这几乎是唯一的方法。(您的应用反映了 REST api 类型的情况)
  5. 它与 ContentResolver 的 ContentObserver 接口相关联——这是一个接口(在许多其他有用的东西中)视图可以注册为观察一组特定的数据(通过光标到该数据)。然后,如果您对 ContentProvider 进行更改,CP 可以通知 CR,CR 可以反过来通知任何相关的游标,这反过来将重新查询并导致视图更新。这比手动跟踪视图要干净得多,这样您就可以使它们无效并重绘它们。

至于数据库的重入锁定,它并没有完全做到这一点,但它有帮助——你的 ContentProvider 类实现了四个简单的函数(CRUD 接口),如果你选择覆盖它,第五个,batchAdd() - - 这会本地化您的锁定。最简单的答案是在函数级别简单地标记所有四个/五个函数声明“同步”,你就完成了。比试图在 5 个不同的 Activity 中找出访问数据库的 20 个位置的锁定要干净得多。

于 2011-04-08T18:37:15.357 回答
1

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

于 2016-06-15T13:52:26.287 回答