对ContentProvider的一点认识

1、ContentProvider

  是android的四大组件之一,作用是对外共享数据,就是把自已应用程序里的数据分享给其他应用程序,其他应用可以通过ContentProvider对你应用中的数据进行添删改查。使用ContentProvider对外共享数据的好处是统一了数据的访问方式。

  ContentProvider(内容提供者)用于提供数据的统一访问格式,封装底层的具体实现。对于数据的使用者来说,无需知晓数据的来源是数据库、文件,或者网络,只需简单地使用ContentProvider提供的数据操作接口,也就是增(insert)、删(delete)、改(update)、查(query)四个过程。

  contentprovider是一个抽象类,想要拥有自己的provider就必须继承自这个类并重写想要实现的方法,并且在manifest文件里进行注册。如:
//这里只想实现插入和查询
 @Override
    public boolean onCreate() {
        smsDbHelper = SmsDbHelper.getInstance(getContext());
        return true;
    }

    @Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {
        int match = mUriMater.match(uri);
        switch (match) {
            case CODE_URI_SMS_ALL:
                break;
            case CODE_URI_SMS_ONE:
                long id = ContentUris.parseId(uri);
                selection = "_id = ?";
                selectionArgs = new String[]{String.valueOf(id)};
                break;
        }
            db = smsDbHelper.getReadableDatabase();
            Cursor cr = db.query(SendMsg.TABLE_NAME, projection, selection,
                    selectionArgs, null, null, sortOrder);

           cr.setNotificationUri(getContext().getContentResolver(),URI_SMS_ALL);
        return cr;
    }

    @Nullable
    @Override
    public String getType(Uri uri) {

        return null;
    }

    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        //如果匹配就会返回匹配码
        int match = mUriMater.match(uri);
        if (match != CODE_URI_SMS_ALL)
            throw new IllegalArgumentException("Wrong Uri" + uri);
        db = smsDbHelper.getWritableDatabase();
        long rowId = db.insert(SendMsg.TABLE_NAME, null, values);
        if (rowId > 0) {
            //说明插入成功
            notifyDataSetChange();
            return ContentUris.withAppendedId(uri, rowId);
        }
        db.close();
        return null;
    }

    private void notifyDataSetChange() {
        getContext().getContentResolver().notifyChange(URI_SMS_ALL, null);
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {
        return 0;
    }
    //在manifest文件里进行注册
 <provider
            android:authorities="com.example.lyw.sms.provider"
        android:name=".db.SmsProvider"/>

2.ContentReciver

 当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver 类来完成,要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。 ContentResolver 类提供了与ContentProvider类相同签名的四个方法:

public int delete(Uri uri, String selection, String[]

selectionArgs):该方法用于从ContentProvider删除数据。

public int update(Uri uri, ContentValues values, String

selection, String[] selectionArgs):该方法用于更新ContentProvider中的数据。

public Cursor query(Uri uri, String[] projection, String selection,

String[] selectionArgs, String sortOrder):该方法用于从

ContentProvider中获取数据。

3、Uri介绍
Uri代表了要操作的数据,Uri主要包含了两部分信息:1>需要操作的ContentProvider ,2>对ContentProvider中的什么数据进行操作,会在程序中定义一下几个字段:

  public static final String AUTHORITY ="com.example.lyw.sms.provider";
    //对外查询通过这个常量获取
    public static final Uri URI_SMS_ALL = Uri.parse("content://" + AUTHORITY
            + "/sms");
            + 
private static final int CODE_URI_SMS_ALL = 0;
private static final int CODE_URI_SMS_ONE = 1;            

4、UriMatcher类使用介绍
因为Uri代表了要操作的数据,所以我们经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher和ContentUris 。UriMatcher类用于匹配Uri。

static {
        mUriMater = new UriMatcher(UriMatcher.NO_MATCH);
        //注册路径
        mUriMater.addURI(AUTHORITY, "sms", CODE_URI_SMS_ONE);
        mUriMater.addURI(AUTHORITY, "sms/#", CODE_URI_SMS_ALL);
    }
//匹配操作,如果匹配就会返回匹配码
int match = mUriMater.match(uri);
        switch (match) {
            case CODE_URI_SMS_ALL:
                break;
            case CODE_URI_SMS_ONE:
                long id = ContentUris.parseId(uri);
                selection = "_id = ?";
                selectionArgs = new String[]{String.valueOf(id)};
                break;
        }

5.ContentUris类使用介绍

ContentUris类用于操作Uri路径后面的ID部分( CODE_URI_SMS_ALL)。
withAppendedId(uri, id)用于为路径加上ID部分: 
Uri uri =ContentUris.withAppendedId(uri, rowId);
//生成的URI为:com.example.lyw.sms.provider/sms/rowId;
parseId(uri)方法用于从路径中获取ID部分:
Uri uri = Uri.parse("content://com.example.lyw.sms.provider/sms/10")
long personid = ContentUris.parseId(uri);//personid为10

PS:当修改过provider里的数据需要调用,
getContext().getContentResolver().notifyChange(URI_SMS_ALL, null)

具体应用等我整理号代码再上传。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值