注册ContentProvider:

<provider     android:name=".provider.UserProvider"    android:authorities="com.rw.contentprovider.provider.UserProvider"    android:exported="true"    ></provider>

其中authorities是URI中的域名部分,可以随便取,但必须在整个系统中唯一

name和ACtivity一样,告诉虚拟机与之绑定的class

exported指定ContentProvider是否允许被其他应用调用

继承ContentProvider的以下5个方法:

可以根据自己的业务需求,实现相应的方法

以下是自己写的demo,有之前写的DBOpenHelper类的支持

public Cursor query(Uri uri, String[] projection, String selection,            String[] selectionArgs, String sortOrder) {                SQLiteDatabase dataBase= this.userDatabase.getReadableDatabase();        switch (USERMATCHER.match(uri)) {        case USER:            long rawId= ContentUris.parseId(uri);            String where="uid="+rawId;            if(selection!=null){                where+=" and "+selection;            }            return dataBase.query("users", projection, where, selectionArgs, null, null,sortOrder);        case USERS:            return dataBase.query("users", projection, selection, selectionArgs, null,null, sortOrder);        default:            throw new IllegalArgumentException("this unknown Uri:"+uri.toString());        }    }
public String getType(Uri uri) {        switch (USERMATCHER.match(uri)) {        case USER:            return "vnd.android.cursor.dir/user";            case USERS:            return "vnd.android.cursor.item/user";            default:                        throw new IllegalArgumentException("this is unknown Uri:"+uri.toString());        }    }
public Uri insert(Uri uri, ContentValues values) {        SQLiteDatabase dataBase= this.userDatabase.getWritableDatabase();        switch (USERMATCHER.match(uri)) {        case USER:                        throw new IllegalArgumentException("this Uri can not insert a record to Content!");                    case USERS:            long rawId=dataBase.insert("users", null, values);                        return ContentUris.withAppendedId(uri, rawId);        default:                        throw new IllegalArgumentException("this unknown Uri:"+uri.toString());        }    }
public int delete(Uri uri, String selection, String[] selectionArgs) {        SQLiteDatabase dataBase= this.userDatabase.getWritableDatabase();        switch (USERMATCHER.match(uri)) {        case USER:            long rawId= ContentUris.parseId(uri);            String where="uid="+rawId;            if(selection!=null){                where+=" and "+selection;            }            return dataBase.delete("users", where, selectionArgs);        case USERS:                        return dataBase.delete("users", selection, selectionArgs);        default:                        throw new IllegalArgumentException("this unknown Uri:"+uri.toString());        }    }
public int update(Uri uri, ContentValues values, String selection,            String[] selectionArgs) {        SQLiteDatabase dataBase=userDatabase.getWritableDatabase();        switch (USERMATCHER.match(uri)) {        case USER:            long rawId= ContentUris.parseId(uri);            String where="uid="+rawId;            if(selection!=null){                where+=" and "+selection;            }            return dataBase.update("users", values, where, selectionArgs);        case USERS:            if(selection!=null){                return dataBase.update("users", values, selection, selectionArgs);            }else{                throw new IllegalArgumentException("this Uri con not update record from dataBase");            }        default:                        throw new IllegalArgumentException("this Uri is unknown:"+uri.toString());        }    }

在使用者使用ContentResolver对数据进行CURD操作时,分别调用了与之对应的的方法,其实其底层也是根据URI获取到了这个ContentProvider,进而将参数传递给ContentProvider中与之对应的方法。以下是其中一类的Code

public final int update(Uri uri, ContentValues values, String where,            String[] selectionArgs) {        //在这里根据传入的Uri,获取到一个ContentProvider        IContentProvider provider = acquireProvider(uri);        if (provider == null) {            throw new IllegalArgumentException("Unknown URI " + uri);        }        try {            long startTime = SystemClock.uptimeMillis();            //在这里真正执行ContentProvider的update方法            int rowsUpdated = provider.update(mPackageName, uri, values, where, selectionArgs);            long durationMillis = SystemClock.uptimeMillis() - startTime;            maybeLogUpdateToEventLog(durationMillis, uri, "update", where);            return rowsUpdated;        } catch (RemoteException e) {            // Arbitrary and not worth documenting, as Activity            // Manager will kill this process shortly anyway.            return -1;        } finally {            releaseProvider(provider);        }    }

更多相关文章

  1. Android Activity onConfigurationChanged()方法 监听状态改变
  2. Android高手进阶教程(二十)之---Android与JavaScript方法相互调
  3. android中的坐标系以及获取坐标的方法
  4. Android与JavaScript方法相互调用
  5. 创建Android库的方法及Android .aar文件用法小结
  6. Android各种资源引用的方法
  7. Android 性能优化的一些方法

随机推荐

  1. android各sdk,cpu_img,source,doc下载
  2. Android(安卓)AsyncTask介绍
  3. Android(安卓)DVM [1]
  4. Android--取得MD5指纹,取得MapKey
  5. Android(安卓)SDK 2.2 离线安装
  6. Android推送通知指南
  7. android开发(二):android结构
  8. Android入门教程(二)之------环境搭建
  9. android EditText中的inputType
  10. 安卓巴士总结了近百个Android优秀开源项