Android 私人内容提供商的用途是什么?

Android 私人内容提供商的用途是什么?,android,data-storage,android-contentprovider,Android,Data Storage,Android Contentprovider,机器人说 内容提供商也有助于 读取和写入数据,即 对您的应用程序是私有的,而不是 共享 通常,内容提供商用于向不同的应用程序提供数据或在它们之间共享数据。我想知道有私人供应商而不想分享有什么用。是否提供了直接访问数据库或文件系统所不能提供的任何好处 谢谢, 拉贾斯 它会在后台线程中自动安排所有服务器端和同步数据库访问。但是,在应用程序前端,默认情况下,内容解析器/提供者通常会从UI线程执行查询/事务。必须异步执行所有事务(即使用游标加载程序),以确保应用程序在UI端平稳运行 它将通过Conten

机器人说

内容提供商也有助于 读取和写入数据,即 对您的应用程序是私有的,而不是 共享

通常,内容提供商用于向不同的应用程序提供数据或在它们之间共享数据。我想知道有私人供应商而不想分享有什么用。是否提供了直接访问数据库或文件系统所不能提供的任何好处

谢谢, 拉贾斯

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

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

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

    ,感谢你抽出时间把它们列出来。这是非常有用的信息。大多数点是有效的,但它真的帮助你处理线程(第一点)?您仍然需要将对contentprovider的访问转移到另一个线程。@JanBerkel:嗯,它或多或少会为您“自动”处理它。ContentProvider/Query/Cursor/ContentObserver模型对您隐藏了数据库访问的实际线程。在编程上,您永远不必考虑启动线程或担心锁定或等待线程完成。所以我想我的观点是,它将背景线程的基本细节抽象到一个看起来或多或少是单线程的界面中。@嗯,如果你不做任何特殊的事情,任何来自主线程的内容提供者访问仍然会停留在主线程上,没有自动调度。你的两个权利-它是处理线程和内容提供者的asycn行为的游标加载程序。来自“异步查询:您应该在单独的线程中执行查询。一种方法是使用游标加载程序对象。加载程序指南中的示例演示了如何执行此操作。”