关于 ContentProvider
来源:互联网 发布:邓小平纪念馆网络留言 编辑:程序博客网 时间:2024/06/07 17:08
ContentProvider 可以看作是一个数据包装器, SQLite 数据库就是可封装到 ContentProvider 中的数据源的一个例子.
本博文 重点介绍 实现ContentProvider
要编写ContentProvider 必须扩展 android.content.ContentProvider, 实现以下重要方法
1. query
2. insert
3. update
4. delete
5. getType
在实现前还需要进行大量设置,以及以下步骤:
1. 计划数据库、URI、列名称等,创建元数据类来定义所有元数据元素的常量;
2. 扩展抽象类 ContentProvider
3. 实现方法: query、insert、update、delete、getType
4. 在描述文件中注册提供程序
具体代码请参见 ch04_TestProvider 工程,如图所示
注意以下几点:
在代码中,
1. BookProvider 继承 ContentProvider, 重写onCreate() 来创建数据库
2. ContentProvider 需要一种机制来区分各种URI, 使用UriMatchter 可以实现此功能。
3. BookProvider 必须实现 getType() ,以返回给定URI 的MIME(多用途互联网邮件扩展) 类型, 在本示例中,getType() 第一个任务就是区分URI的类型: 它是一个图书集合,还是一本图书?
---------------------------------
下面介绍一个重要内容 UriMatcher
UriMatcher 类帮助识别URI 类型
UriMatcher 的工作原理是: 你告诉 UriMatcher 实例需要什么样的URI 模式,还将一个唯一编号与每个模式关联。注册这些模式之后,可以询问UriMatcher ,传入的URI 是否与某个模式匹配。
private static final UriMatcher sUriMatcher;
private static final int INCOMING_BOOK_COLLECTION_URI_INDICATOR = 1;
private static final int INCOMING_SINGLE_BOOK_URI_INDICATOR = 2;
static {
sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
sUriMatcher.addURI(BookProviderMetaData.AUTHORITY, "books",
INCOMING_BOOK_COLLECTION_URI_INDICATOR);
sUriMatcher.addURI(BookProviderMetaData.AUTHORITY, "books/#",
INCOMING_SINGLE_BOOK_URI_INDICATOR);
}
以上完成注册了UriMatcher, UriMatcher在查询方法实现中发挥重要判断作用。
下面介绍 使用投影映射
ContentProvider 充当着抽象列表和数据库真实列表的媒介, 这些列表可能是不同的。
在构造查询时必须在客户端的 where 子句列与真实的数据库列之间建立映射, 借助SQLiteQueryBuilder 类可以建立投影映射,通过setProjectionMap(Map columnMap)方法
此方法定义是: 为查询设置投影映射,投影映射将从调用方法传入查询中的列名称映射到数据库列名称。相关代码如下:
private static HashMap<String, String> sBooksProjectionMap;
static {
sBooksProjectionMap = new HashMap<String, String>();
sBooksProjectionMap.put(BookTableMetaData._ID, BookTableMetaData._ID);
//name, isbn, author
sBooksProjectionMap.put(BookTableMetaData.BOOK_NAME, BookTableMetaData.BOOK_NAME);
sBooksProjectionMap.put(BookTableMetaData.BOOK_ISBN, BookTableMetaData.BOOK_ISBN);
sBooksProjectionMap.put(BookTableMetaData.BOOK_AUTHOR,BookTableMetaData.BOOK_AUTHOR);
//created date, modified date
sBooksProjectionMap.put(BookTableMetaData.CREATED_DATE, BookTableMetaData.CREATED_DATE);
sBooksProjectionMap.put(BookTableMetaData.MODIFIED_DATE, BookTableMetaData.MODIFIED_DATE);
}
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(BookTableMetaData.TABLE_NAME);
qb.setProjectionMap(sBooksProjectionMap);
最后一定要在配置文件注册ContentProvider
<provider android:name=".BookProvider" android:authorities="com.androidbook.provider.BookProvider"/>
- 关于 ContentProvider
- 关于ContentProvider
- 关于ContentProvider
- 关于ContentProvider 使用replace
- 关于android的contentProvider
- 关于Contentprovider的小结
- android学习 关于contentprovider
- 关于ContentProvider的使用
- 关于ContentProvider使用总结
- ContentProvider
- ContentProvider
- ContentProvider
- ContentProvider
- contentProvider
- ContentProvider
- ContentProvider
- ContentProvider
- contentprovider
- c语言中相关文件输入输出小结
- jquery验证电话号码
- poj1458
- 01背包问题 动态规划
- 一道题_20121217
- 关于 ContentProvider
- ROS 创建package,并加入到eclipse开发环境中
- C#中dataGridView用法实例分析
- 10条最常用的命令
- postgreSQL 自动备份脚本
- FFMpeg框架代码阅读
- 【Oracle】杂记
- ActionBar实用案例(返回功能、子菜单、搜索功能)
- cin标准输入流错误清理