Android ContentProvider 学习总结

      大家好,小丸子每日一篇总结又开始写啦,Android 四大组件,之前看过很多皮毛来应对面试,终于可以静下心,系统的学习一些入门的东西,这次是看的慕课网学习的,如何利用ContentProvider进行系统联系人的查询与插入,在此感谢老师的讲解。

ContentProvider:

       内容提供者,它同时也是存储数据的一种可选择的方式。当我们无法操作其他应用程序的数据的时候,它就可以帮我们解决,因为ContentProvider提供了应用程序之间共享数据的机制。ContentProvider除了系统提供的以外我们也可以自定义,由于丸子还是入门阶段,不是理解的很好,期待以后丸子进阶的时候再来写。

       那么系统的ContentProvider都可以给我们提供什么样的数据呢?媒体库、通讯录、通话记录、短信读取。。。。。。等等等等,但是老师说常用的就是列举出来的这几个,我也没怎么用过。

       

1、ContentProvider提供的方法

ContentProvider是一个抽象类,在自定义的情况下,需要实现以下几个方法:  

抽象类: 

方法:    

<span style="font-size:12px;">public class ContentProviderChild extends ContentProvider {
    @Override
    public boolean onCreate() {
        return false;
    }

    @Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        return null;
    }

    @Nullable
    @Override
    public String getType(Uri uri) {
        return null;
    }

    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        return 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;
    }
}
</span>
正如你所看见的,ContentProvider提供了五种方法,query、getType、insert、delete、update。

query:查询,大家可以看到该方法的返回类型是Cursor 游标,Cursor里面包含了查询到的所有数据条目。

getType:得到类型,返回的是字符串,这是根据Uri拿到该Uri的类型。

insert:插入,返回类型是Uri,向原有数据里面插入新数据。

delete: 删除

update:修改

这里有一些还没有使用过,所以暂且这么介绍,也希望大神在评论下赐教。

2.如何利用ContentProvider查询、插入联系人

<span style="font-size:12px;">        /**
         * 插入
         */</span>
<span style="font-size:12px;">       //我们就是通过ContentResolver来进行系统ContentProvider的增删改查哒。。。。。。
        ContentResolver contentResolver = getContentResolver();</span>
<span style="font-size:12px;">       //上面的方法介绍可以看到,插入的传入参数,Uri,ContentValues,所以在这里我们先新建一个ContentValues对象
        ContentValues values = new ContentValues();</span>
<span style="font-size:12px;">        //这里返回的是Uri类型的参数,为啥要用这个Uri呢?<span style="font-family: Arial, Helvetica, sans-serif;">RawContacts.CONTENT_URI,别问我,规定。。。。。。</span>
        Uri uri = contentResolver.insert(RawContacts.CONTENT_URI, values);</span>
<span style="font-size:12px;">        //进行插入操作之后,会生成一个唯一的uri,这里是对其进行解析,生成id
        Long raw_contact_id = ContentUris.parseId(uri);</span>
<span style="font-size:12px;">        //我们从这里开始将我们的Values传一些值进去</span>
<span style="font-size:12px;">        values.clear();
        values.put(StructuredName.RAW_CONTACT_ID, raw_contact_id);
        values.put(StructuredName.DISPLAY_NAME, "东明");
        values.put(StructuredName.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
        uri = contentResolver.insert(ContactsContract.Data.CONTENT_URI, values);

        values.clear();
        values.put(Phone.RAW_CONTACT_ID, raw_contact_id);
        values.put(Phone.NUMBER, "1341446627");
        values.put(Phone.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
        values.put(Phone.TYPE, Phone.TYPE_HOME);
        uri = contentResolver.insert(ContactsContract.Data.CONTENT_URI, values);</span>
<span style="font-size:12px;">

        /**
         * 查询
         */
        Cursor cursor = contentResolver.query(Contacts.CONTENT_URI, new String[]{
                Contacts._ID, Contacts.DISPLAY_NAME}, null, null, null);

        //Cursor是一个结果的集合一点要判空,否则会报空指针的异常
        if (cursor != null) {
            while (cursor.moveToNext()) {
                int id = cursor.getInt(cursor.getColumnIndex(Contacts._ID));
                String name = cursor.getString(cursor.getColumnIndex(Contacts.DISPLAY_NAME));
                Log.d(TAG, "id:" + id);
                Log.d(TAG, "name:" + name);

                /**
                 * 根据ID查询电话号码
                 */
                Cursor cursor1 = contentResolver.query(Phone.CONTENT_URI, new String[]{Phone.TYPE, Phone.NUMBER}, Phone._ID + "=" + id, null, null);
                if (cursor1 != null) {
                    while (cursor1.moveToNext()) {
                        int type = cursor1.getInt(cursor1.getColumnIndex(Phone.TYPE));
                        if (type == Phone.TYPE_HOME) {
                            Log.d(TAG, "家庭电话:" + cursor1.getString(cursor1.getColumnIndex(Phone.NUMBER)));
                        } else if (type == Phone.TYPE_MOBILE) {
                            Log.d(TAG, "手机号码:" + cursor1.getString(cursor1.getColumnIndex(Phone.NUMBER)));
                        }
                    }
                    cursor1.close();
                }

                /**
                 * 根据ID查询邮箱
                 */
                Cursor cursor2 = contentResolver.query(Email.CONTENT_URI, new String[]{Email.TYPE, Email.DATA}, Email.CONTACT_ID + "=" + id, null, null);
                if (cursor2 != null) {
                    while (cursor2.moveToNext()) {
                        int type = cursor2.getInt(cursor2.getColumnIndex(Email.TYPE));
                        if (type == Email.TYPE_HOME) {
                            Log.d(TAG, "家庭邮箱:" + cursor2.getString(cursor2.getColumnIndex(Email.DATA)));
                        } else if (type == Email.TYPE_WORK) {
                            Log.d(TAG, "工作邮箱:" + cursor2.getString(cursor2.getColumnIndex(Email.DATA)));
                        }
                    }
                    cursor2.close();
                }
            }
            cursor.close();

        }
</span>
一定要记得将游标全部都close。                                                 

 感觉理解的还不是特别好,明天继续看看相关的,end

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值