Android mobile development and application
安徽师范大学-计算机信息学院-2019-2020学年第一学期, 作者(授课教师): 周文
Content Provider使用基于数据库模型的简单表格来提供其中的数据,这里每行代表一条记录,每列代表特定类型和含义的数据。
例如,联系人的信息可能以如下方式提供:
| _ID | NAME | NUMBER | |
|---|---|---|---|
| 001 | 张** | 139******* | zhang*****@163.com |
| 002 | 王** | 189******* | wang*****@126.com |
| 003 | 刘** | 137******* | liu*****@qq.com |
每个Content Provider提供公共的URI(使用Uri类包装)来唯一标识其数据集。管理多个数据集(多个表格)的Content Provider为每个都提供了单独的URI。所有为provider提供的URI都以“content://”作为前,“content://”模式表示数据由Content Provider来管理。

开发人员需要下面3条信息才能查询Content Provider中的数据:
Content Provider的URI;Content Provider中增加新数据,首先需要在ContentValues对象中建立键值对映射,这里每个键匹配content provider中列名,每个值是该列中希望增加的值。ContentResolver.insert()方法并传递给它provider的URI参数和ContentValues映射。该方法返回新记录的完整URI,即增加了新记录ID的URI。URI来查询并获取该记录的Cursor,以便修改该记录。Contacts数据库的最佳方式是增加保存新数据的表名到代表记录的URIURI来增加新数据。Contacts表格以CONTENT_DIRECTORY常量的方式提供名称作为该用途。为了批量更新数据(例如,将全部字段中“NY”替换成“New York”)使用ContentResolver.update()方法并提供需要修改的列名和值。
如果需要删除单条记录,调用ContentResolver.delete()方法并提供特定行的URI。如果需要删除多条记录,调用ContentResolver.delete()方法并提供删除记录类型的URI
android.provider.Contacts.People.CONTENT_URI 一个SQL WHERE语句,它定义哪些行需要删除。

查询联系人ID和姓名

开发人员定义ContentProvider类的子类以便使用ContentResolver和Cursor类带来的便捷来共享数据。
ContentProvider类定义的以下6个抽象方法:public boolean onCreate()public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)public Uri insert(Uri uri, ContentValues values)public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)public int delete(Uri uri, String selection, String[] selectionArgs)public String getType(Uri uri)
| 方法 | 说明 |
|---|---|
| OnCreate() | 用于初始化provider |
| query() | 返回数据给调用者 |
| insert() | 插入新数据到Content Provider |
| update() | 更新Content Provider 中已经存在的数据 |
| delete() | 从Content Provider 中删除数据 |
| getType() | 返回Content Provider数据的MINE类型 |
query()方法必须返回Cursor对象,它用于遍历查询结果。
Cursor自身是一个接口,但是Android提供了一些该接口的实现类,
SQLiteCursor能遍历存储在SQLite数据库中的数据。SQLiteDatabase类的query()方法可以获得Cursor对象。android.database包中为了让Android系统知道开发人员编写的Content Provider,应该在应用程序的AndroidManifest.xml文件中定义<provider>元素。没有在配置文件中声明的自定义Content Provider对于Android系统不可见。
name属性的值是ContentProvider类的子类的完整名称。authorities属性是provider定义的content:URI中authority部分。ContentProvider的子类是EmployeeProvider,<provider>元素应该如下:
xxxxxxxxxx<provider android:name="cn.ahnu.edu.EmployeeProvider" android:authorities="cn.ahnu.edu.employeeprovider".../></provider>
本章结束
2019-9-1