ContentProvider进行数据共享

 ContentProvider:

    作用:对外共享数据,通过Content Provider把应用中数据共享给其他应用访问,其他应用通过Content Provider对应用中得数据进行添删改查。

    好处:Content Provider对外共享数据的好处是统一数据的访问方式。

    步骤例子:

    (1)继承ContentProvider类,重写方法:

        public class PersonContentProvider extends ContentProvider{

            //该方法在ContentProvider创建后就会被调用, Android开机后, ContentProvider在其它应用第一次访问它时才会被创建。
            public boolean onCreate()

            //该方法用于供外部应用往ContentProvider添加数据。
            public Uri insert(Uri uri, ContentValues values)

            //该方法用于供外部应用从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)

            //该方法用于返回当前Url所代表数据的MIME类型。

            //(如果操作的数据属于集合类型,MIME类型以vnd.android.cursor.dir/开头)

            //(如果操作的数据属于非集合类型数据,MIME类型以vnd.android.cursor.item/开头)
            public String getType(Uri uri)

         }

    (2)在AndroidMainifest.xml中进行配置:

         ContentProvider 采用了authorities(主机名/域名)对它进行唯一标识,可以把 ContentProvider看作是一个网站,authorities 就是他的域名:

        <manifest .... >
            <application android:icon="@drawable/icon" android:label="@string/app_name">
                <provider android:name=".PersonContentProvider" android:authorities="com.qgmobile.providers.personprovider"/>
            </application>
        </manifest>

 

ContentResolver :

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

    例子:(使用ContentResolver对ContentProvider中的数据进行添加、删除、修改和查询操作)

        ContentResolver resolver =  getContentResolver();
        Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person");
        //添加一条记录
        ContentValues values = new ContentValues();
        values.put("name", "CongHua");
        values.put("age", 20);
        resolver.insert(uri, values);  
        //获取person表中所有记录
        Cursor cursor = resolver.query(uri, null, null, null, "personid desc");
        while(cursor.moveToNext()){
             Log.i("ContentTest", "personid="+ cursor.getInt(0)+ ",name="+ cursor.getString(1));
        }
        //把id为1的记录的name字段值更改新为liming
        ContentValues updateValues = new ContentValues();
        updateValues.put("name", "qgmobile");
        Uri updateIdUri = ContentUris.withAppendedId(uri, 2);
        resolver.update(updateIdUri, updateValues, null, null);
        //删除id为2的记录
        Uri deleteIdUri = ContentUris.withAppendedId(uri, 2);
        resolver.delete(deleteIdUri, null, null);

监听ContentProvider中数据的变化:

    (1)如果ContentProvider的访问者要知道ContentPrivider的变化,可以在ContentProvider发生变化时调用getContentResolver().notifyChange(uri,null)来通知注册此Uri上的访问者。

    例子:

        public class PersonContentProvider extends ContentProvider {
            public Uri insert(Uri uri, ContentValues values) {
                db.insert("person", "personid", values);
                getContext().getContentResolver().notifyChange(uri, null);
            }
        }

    (2)如果ContentProvider的访问者需要得到数据变化通知,必须使用ContentObserver对数据(数据采用uri描述)进行监听,当监听到数据变化通知时,系统就会调用ContentObserver的onChange()方法。
    例子:

        getContentResolver().registerContentObserver(Uri.parse("content://cn.itcast.providers.personprovider/person"),true, new PersonObserver(new Handler()));
        public class PersonObserver extends ContentObserver{
            public PersonObserver(Handler handler) {
                super(handler);
            }
            public void onChange(boolean selfChange) {
             //此处可以进行相应的业务处理
            }
        }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值