Android中ContentProvider的实现及定义自己的ContentProvider



在Android中,每个程序都在自己的进程中运行,互不干扰.这样的好处不说了,但是带来的问题就是想要在程序之间实现数据共享,在没有其它工具的帮助下,就难以实现了.为了解决这个问题,ContentProvider就派上用场了.

一,说说ContentProvider怎么用.


   1,把你想要共享出去的数据用一个URl表示出来.如:content://contacts/people/5(联系人信息中Id位5的联系人记录).或者这样也行:Uri person =ContentUris.withAppendedId(People.CONTENT_URI,5);来封装.

   2,所有的Content Providers都会实现一些共同的接口,可以通过唯一的ContentResolveer来向外提供数据,冰进行一系列的增删改查;ContentResolver cr = getContentResplver();

   3,cr利用定义好的uri(作为参数送给cr封装好的方法里面进行一系列的操作);

至于ContentProvider的实例化,这些不需要我们去做,系统会做这件事.对于ContentProvider,正常情况下,只需一个,但是ContentResolver可以存在多个,在不同进程中的

ContentResolver可以使用同一个ContentProvider.


二,定义自己的ContentProvider

     根据我个人的理解,这作用就有点像J2EE里面的DAO的作用.
    
    1,实现一个定义节本字段的类.示例如下:
          
          
  public class NotePad
{
    //ContentProvider的uri
    public static final String    AUTHORITY    = "com.google.provider.NotePad";

    private NotePad(){}

    // 定义基本字段
    public static final class Notes implements BaseColumns
    {
        private Notes(){}

        public static final Uri        CONTENT_URI            = Uri.parse("content://" + AUTHORITY + "/notes");

        // 新的MIME类型-多个
        public static final String    CONTENT_TYPE        = "vnd.android.cursor.dir/vnd.google.note";

        // 新的MIME类型-单个
        public static final String    CONTENT_ITEM_TYPE    = "vnd.android.cursor.item/vnd.google.note";

        public static final String    DEFAULT_SORT_ORDER    = "modified DESC";

        //字段
        public static final String    TITLE                = "title";
        public static final String    NOTE                = "note";
        public static final String    CREATEDDATE        = "created";
        public static final String    MODIFIEDDATE        = "modified";
    }
}

          
 解释一下MIME类型,假如你要处理的数据类型是新的类型,就得定义一个新的MIME类型,一边ContentProvider.getType(url)来调用;
 粉单个与多个;

 
  2,创建自己的ContentProvider
      
    如果要共享的是数据库,我们在这里可以封装一个SqlLiteOpenHelper,以便建库建表 ,对于 SqlLiteOpenHelper 用过数据库的人应该都懂,在这里就不赘述了;
    
    然后在ContentProvider里面实现增删改查,另外如果有自定义类型的话,还的在ContentProvider刘main实现一个方法    
        
    public String getType(Uri uri)
    {
        switch (sUriMatcher.match(uri))
        {
            case NOTES:
                return Notes.CONTENT_TYPE;

            case NOTE_ID:
                return Notes.CONTENT_ITEM_TYPE;

            default:
                throw new IllegalArgumentException("Unknown URI " + uri);
        }
    }
 
 实例如下:
 
     public class NotePadProvider extends ContentProvider
{
    private static final String                TAG                    = "NotePadProvider";
    // 数据库名
    private static final String                DATABASE_NAME        = "note_pad.db";
    private static final int                DATABASE_VERSION    = 2;
    // 表名
    private static final String                NOTES_TABLE_NAME    = "notes";
    private static HashMap<String, String>    sNotesProjectionMap;
    private static final int                NOTES                = 1;
    private static final int                NOTE_ID                = 2;
    private static final UriMatcher            sUriMatcher;
    private DatabaseHelper    mOpenHelper;
    //创建表SQL语句
    private static final String                CREATE_TABLE="CREATE TABLE "
                                                        + NOTES_TABLE_NAME
                                                        + " (" + Notes._ID
                                                        + " INTEGER PRIMARY KEY,"
                                                        + Notes.TITLE
                                                        + " TEXT,"
                                                        + Notes.NOTE
                                                        + " TEXT,"
                                                        + Notes.CREATEDDATE
                                                        + " INTEGER,"
                                                        + Notes.MODIFIEDDATE
                                                        + " INTEGER" + ");";
    
    static
    {
        sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        sUriMatcher.addURI(NotePad.AUTHORITY, "notes", NOTES);
        sUriMatcher.addURI(NotePad.AUTHORITY, "notes/#", NOTE_ID);

        sNotesProjectionMap = new HashMap<String, String>();
        sNotesProjectionMap.put(Notes._ID, Notes._ID);
        sNotesProjectionMap.put(Notes.TITLE, Notes.TITLE);
        sNotesProjectionMap.put(Notes.NOTE, Notes.NOTE);
        sNotesProjectionMap.put(Notes.CREATEDDATE, Notes.CREATEDDATE);
        sNotesProjectionMap.put(Notes.MODIFIEDDATE, Notes.MODIFIEDDATE);
    }
    private static class DatabaseHelper extends SQLiteOpenHelper
    {
        //构造函数-创建数据库
        DatabaseHelper(Context context)
        {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }
        //创建表
        @Override
        public void onCreate(SQLiteDatabase db)
        {
            db.execSQL(CREATE_TABLE);
        }
        //更新数据库
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
        {
            db.execSQL("DROP TABLE IF EXISTS notes");
            onCreate(db);
        }
    }
    @Override
    public boolean onCreate()
    {
        mOpenHelper = new DatabaseHelper(getContext());
        return true;
    }
    @Override
    //查询操作
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
    {
        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
        switch (sUriMatcher.match(uri))
        {
            case NOTES:
                qb.setTables(NOTES_TABLE_NAME);
                qb.setProjectionMap(sNotesProjectionMap);
                break;

            case NOTE_ID:
                qb.setTables(NOTES_TABLE_NAME);
                qb.setProjectionMap(sNotesProjectionMap);
                qb.appendWhere(Notes._ID + "=" + uri.getPathSegments().get(1));
                break;

            default:
                throw new IllegalArgumentException("Unknown URI " + uri);
        }
        String orderBy;
        if (TextUtils.isEmpty(sortOrder))
        {
            orderBy = NotePad.Notes.DEFAULT_SORT_ORDER;
        }
        else
        {
            orderBy = sortOrder;
        }
        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
        Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
        c.setNotificationUri(getContext().getContentResolver(), uri);
        return c;
    }
    @Override
    // 如果有自定义类型,必须实现该方法
    public String getType(Uri uri)
    {
        switch (sUriMatcher.match(uri))
        {
            case NOTES:
                return Notes.CONTENT_TYPE;

            case NOTE_ID:
                return Notes.CONTENT_ITEM_TYPE;

            default:
                throw new IllegalArgumentException("Unknown URI " + uri);
        }
    }
    @Override
    //插入数据库
    public Uri insert(Uri uri, ContentValues initialValues)
    {
        if (sUriMatcher.match(uri) != NOTES)
        {
            throw new IllegalArgumentException("Unknown URI " + uri);
        }
        ContentValues values;
        if (initialValues != null)
        {
            values = new ContentValues(initialValues);
        }
        else
        {
            values = new ContentValues();
        }
        Long now = Long.valueOf(System.currentTimeMillis());

        if (values.containsKey(NotePad.Notes.CREATEDDATE) == false)
        {
            values.put(NotePad.Notes.CREATEDDATE, now);
        }
        if (values.containsKey(NotePad.Notes.MODIFIEDDATE) == false)
        {
            values.put(NotePad.Notes.MODIFIEDDATE, now);
        }
        if (values.containsKey(NotePad.Notes.TITLE) == false)
        {
            Resources r = Resources.getSystem();
            values.put(NotePad.Notes.TITLE, r.getString(android.R.string.untitled));
        }
        if (values.containsKey(NotePad.Notes.NOTE) == false)
        {
            values.put(NotePad.Notes.NOTE, "");
        }
        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        long rowId = db.insert(NOTES_TABLE_NAME, Notes.NOTE, values);
        if (rowId > 0)
        {
            Uri noteUri = ContentUris.withAppendedId(NotePad.Notes.CONTENT_URI, rowId);
            getContext().getContentResolver().notifyChange(noteUri, null);
            return noteUri;
        }
        throw new SQLException("Failed to insert row into " + uri);
    }
    @Override
    //删除数据
    public int delete(Uri uri, String where, String[] whereArgs)
    {
        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        int count;
        switch (sUriMatcher.match(uri))
        {
            case NOTES:
                count = db.delete(NOTES_TABLE_NAME, where, whereArgs);
                break;

            case NOTE_ID:
                String noteId = uri.getPathSegments().get(1);
                count = db.delete(NOTES_TABLE_NAME, Notes._ID + "=" + noteId + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);
                break;

            default:
                throw new IllegalArgumentException("Unknown URI " + uri);
        }
        getContext().getContentResolver().notifyChange(uri, null);
        return count;
    }
    @Override
    //更新数据
    public int update(Uri uri, ContentValues values, String where, String[] whereArgs)
    {
        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        int count;
        switch (sUriMatcher.match(uri))
        {
            case NOTES:
                count = db.update(NOTES_TABLE_NAME, values, where, whereArgs);
                break;

            case NOTE_ID:
                String noteId = uri.getPathSegments().get(1);
                count = db.update(NOTES_TABLE_NAME, values, Notes._ID + "=" + noteId + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);
                break;

            default:
                throw new IllegalArgumentException("Unknown URI " + uri);
        }
        getContext().getContentResolver().notifyChange(uri, null);
        return count;
    }
}



这样我们就实现了一个自定义的ContentProvider,档然最后不要忘记一件事情了,在AndroidMinifest.xml中声明我们定义好的ContentProvider

    <provider android:name="NotePadProvider"
    android:authorities="com.google.provider.NotePad"/>
    
好了,一切OK!


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值