Android开发:为应用程序自定义ContentProvider对象以

今日学习任务:以简单的备忘录应用程程序为例,实现ContentProvider,并测试。

涉及的主要内容:1) 创建ContentProvider所需的步骤 2)学习官方实例代码(Note Pad)  

1. 如何为自己的应用程序自定义ContentProvider

首先,我们得有数据。所以,需要创建一个SQLite数据库来存储数据。而为了访问数据库,我们需要提供访问数据库的各种接口,如创建,打开,升级等

其次,创建一个类,继承ContentProvider类,并实现其中访问数据的所有方法,包括:1)query():查询  2) insert():插入  3)update():插入  4)delete():删除  5)getType():获得类型  6)onCreate():创建时调用。

最后,定义好的ContentProvider类必须在AndroidManifest.xml里声明后,才能使用。声明中必须添加的参数是授权属性“android:authorities”。

在实际的写代码过程中,目前只能好好研究developer.android.com上面的相关实例代码,学习Google提供的良好规范的代码:

在这个Note pad的例子中,Notepad.java和NotePadProvider.java两个文件是与创建ContentProvider相关的两个文件。其中Notepad.java类定义了用于可以访问的ContentProvider的常量,之所以创建这个文件,我觉得是优化代码架构而把常量写在同一个类中方便调用和访问。而NotePadProvider则主要涉及数据的相关操作,包括数据库的创建,连接以及继承实现ContenProvider类的6个方法。在阅读这部分代码时,对我来说最大的苦难是需要很好地理解URI的原理,只有这样才能看懂Google提供的代码的结构。关于URI的理解请参考官方文档:

中最后部分:Content URI Summary。

令人欣慰的是,Google提供的实例代码有详细的注释,这样方便了我们去理解和学习。 

2.  现在以备忘录程序为例,来实现以上各个部分。

注:假设备忘录程序中只有一张数据表,叫做Memo, 表中有两个字段: _ID 和 MemoContent。 

2.1 参考Notepad.java 创建 MemoContract.java 类,定义各种 主要的URI和数据表字段常量。之所以定义这个类,可以参考下面关于该类的注释

package com.memo;

import android.net.Uri;
import android.provider.BaseColumns;

/**
 * Defines a contract between the Memo content provider and its clients. 
 * A contract defines the information that a client needs to access the provider as one or more data tables.
 * A contract is a public, non-extendable (final) class that contains constants defining column names and URIs. 
 * A well-written client depends only on the constants in the contract.
 
*/
public final class MemoContract {
    
/**
     * identification of the content provider.
     
*/
    
public static final String AUTHORITY = "com.memo.MemoProvider";

    
/**
     * This class can not be instantiated
     
*/
    
private MemoContract(){
    }
    
    
/**
     * Memo table contract
     
*/
    
public static final class Memo implements BaseColumns{
        
/**
         * This class can not be instantiated
         
*/
        
private Memo(){
        }
        
        
/**
         * The table name offered by this provider
         
*/
        
public static final String TABLE_NAME = "Memo";

        
        
/* URI definition */
        
/**
         * The content:// style URL for this table
         
*/
        
public static final Uri CONTENT_URI=Uri.parse("content://"+AUTHORITY+"/"+TABLE_NAME);
        
        
/* MIME definitions */
        
/**
         * The MIME type of {
@link #CONTENT_URI} providing a directory of memo.
         
*/
        
public static final String CONTENT_TYPE= "vnd.android.cursor.dir/vnd.companyName.memo";
        
/**
         * The MIME type of a {
@link #CONTENT_URI} sub-directory of a single memo.
         
*/
        
public static final String CONTENT_ITEM_TYPE= "vnd.android.cursor.item/vnd.companyName.memo";
        
        
/* Default sort order and column definitions for this table */
        
/**
         * The default sort order for this table
         
*/
        
public static final String DEFAULT_SORT_ORDER = _ID+" DESC";
        
/**
         * Column name for the content of the memo
         * <P>Type: TEXT</P>
         
*/
        
public static final String COLUMN_NAME_CONTENT = "MemoContent";

    }
}


内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wypyyz.html