Content providers可以存储并重新获取数据,它可以让所有的应用程序得到。使用Content providers是唯一的在应用程序中分享数据的方法;在android中,所有包都能使用的共同的区域是没有的。
android给普通数据类型装载了许多content providers,例如audio,video,images,个人联系信息,等等。可以从android.provider包中看到以列表形式展现出来,在这里可以查询数据包含的provider。(但是,需要获得读数据的权限)
如果想让数据公开化,有两个选择:第一,可以创建一个属于自己的content provider,通过继承ContentProvider类;第二,通过添加数据到一个已经存在的provider,前提是已经存在一个控制着相同数据类型的provider,并且你有往里面写入数据的权限。
该文档介绍了如何使用content providers,当对原理简单讨论之后,将介绍如何查询一个content provider,如何修改provider控制的数据,和如何创建一个属于自己的content provider。
Content Provider基础
设计者负责覆盖content provider存储的数据,所有的content provider 为了了查询provider和返回结果需要实现一个公共的接口,就像添加、修改、删除数据一样。
客户间接使用的这个接口多数是通过 contentResolver 对象,设计者可以从实现一个activity或者其他应用程序里面得到一个contentResolver 通过调用 getContentResolver() 方法。
如:ContentResolver cr = getContentResolver();
然后可以使用ContentResolver的方法,和任何的content provide 相互作用。
当查询开始时,android 系统确定 content provider是查询目标,并且确保正在运行。系统会初始化 ContentProvider对象,这个不需要你去做,事实上,你根本不需要直接处理 ContentProvider 对象。每一个 ContentProvider 类型都是一个单一实例。但是它会和处于不同应用程序或者进程中的 ContentResolver 对象进行通信。所以,ContentProvider 和 ContentResolver 类 用来处理不用进程间的相互作用。
数据模型
Content Providers 在数据库一个简单的表上展示数据,这张表每一行行都是一条记录,每一列都是特别的数据类型,例如,人员和他们的电话号码信息将以下列方式展示:
每一条记录包含了一个标识该记录的数字 _ID ,这些ID可以用来匹配关联表中的记录,例如:在一张表中查找一个人的电话号码,通过这个人的ID可以映射到另外一张表的关于这个人的信息。(这段话翻译的很纠结,自己也没弄清楚作者后面这句话想表明什么意思)
一个查询将会返回一个Cursor 对象,这个返回的对象通过读取内容字段中每一行,每一列的值的形式获得,它使用专门的方法来读取每一种类型的数据,所以,如果要读取某一个字段,必须先知道该字段包含的是哪种数据类型。