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