关于 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"/>

 

 

 

 

原创粉丝点击