《喜欢阅读的人,究竟能别人强在何处》 后感

作者对林黛玉的人设是
“绛珠仙子”,她是“还泪”的,所以眉目之间凝聚了灵河之畔的清风细雨,离恨天外的灵晖秀气。

成百上千人都会以为ContentProvider很难精通,因为不少书上在介绍ContentProvider是后上来就用很复杂的法门来讲课,还组成什么数据库、xml等等之类操作,搞得看起来很复杂,让洋洋的初学者望而却步,其实我们全然不用惧怕。你可以把ContentProvider看做是一个网站,在生活中你想拜会一个网站就亟须要有一个URL地址,而这里的URI就好比这一个URL地址,然后就足以用ContentResolver拿着这个这一个URI地址去访问了。

成百上千时候人最得意的时候屡次会隐藏着险恶,这个时候越应该恐慌、居安思危,这种认识之下,白岩松告诫自己不要冲昏头脑

二、调用系统的ContentProvider

除了大家友好创造ContentProvider,Android系统也给我们提供了充分的ContentProvider接口,这里就以操作系统的牵连人为例来表明一下怎使用系统提供的ContentProvider接口。

  • ContactsContract.Contacts.CONTENT_URI:联系人Uri。
  • ContactsContract.CommonDataKinds.Phone.CONTENT_URI:联系人电话号码Uri。

1、查询系统关系人

由此系统关系人的Uri获取系统联系人及手机号码:

public void query() {
    showContact = "";
    // 获取联系人的Cursor集合
    Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    while (cursor.moveToNext()) {
        // 获取联系人id
        String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
        // 获取联系人姓名
        String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

        // 获取当前联系人id下的所有电话号码
        Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id, null, null);
        showContact += "--id="+ id + " | name=" + name + "--\n";
        Log.i(TAG, "onCreate: ------id="+ id + " | name=" + name + "------");
        while (phones.moveToNext()) {
            String phone = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            showContact += "phone = " + phone + "\n";
            Log.i(TAG, "onCreate: phone = " + phone);
        }
        phones.close();
    }
    cursor.close();
    tv_show.setText(showContact);
}

查询后log如下:

12-13 17:19:49.490 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: ------id=1 | name=张飞------
12-13 17:19:49.490 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: phone = 151 1511 1511
12-13 17:19:49.499 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: ------id=2 | name=关羽------
12-13 17:19:49.499 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: phone = 153 6969 3869
12-13 17:19:49.499 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: phone = 135 6497 8664
12-13 17:19:49.499 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: phone = 155 5555 5555
12-13 17:19:49.499 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: phone = 133 3333 3333
12-13 17:19:49.508 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: ------id=3 | name=刘备------
12-13 17:19:49.508 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: phone = 156 9637 5648
12-13 17:19:49.508 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: phone = 153 7564 8643
12-13 17:19:49.520 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: ------id=14 | name=吕布------
12-13 17:19:49.520 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: phone = 15678909087
12-13 17:19:49.529 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: ------id=20 | name=孙权------
12-13 17:19:49.529 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: phone = 15366669999
12-13 17:19:49.538 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: ------id=21 | name=曹操------
12-13 17:19:49.538 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: phone = 15699788966
12-13 17:19:49.547 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: ------id=22 | name=马超------
12-13 17:19:49.547 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: phone = 15366999966

2、添加系统关系人:

public void insert() {
    String name = et_name.getText().toString();
    String phone = et_phone.getText().toString();

    if (TextUtils.isEmpty(name) || TextUtils.isEmpty(phone)) {
        Toast.makeText(getApplicationContext(), "不能为空", Toast.LENGTH_LONG).show();
        return;
    }

    ContentValues values = new ContentValues();

    // 往插入一个空值以便获取id
    Uri rawContactUri = getContentResolver().insert(ContactsContract.RawContacts.CONTENT_URI, values);
    long rawContactId = ContentUris.parseId(rawContactUri);

    // ------插入联系人姓名------
    // 设置id
    values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
    // 设置内容类型
    values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
    // 设置名字
    values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, name);
    // 插入姓名
    getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
    values.clear();

    // ------插入联系人电话------
    values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
    values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
    values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone);
    values.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);
    getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);

    Toast.makeText(getApplicationContext(), "添加成功", Toast.LENGTH_LONG).show();
    query();
}

在输入框中输入联系人姓名(诸葛武侯)及电话号码(13696969696),然后点击添加按钮,log如下:

12-13 17:23:37.577 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: ------id=1 | name=张飞------
12-13 17:23:37.577 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: phone = 151 1511 1511
12-13 17:23:37.589 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: ------id=2 | name=关羽------
12-13 17:23:37.590 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: phone = 153 6969 3869
12-13 17:23:37.590 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: phone = 135 6497 8664
12-13 17:23:37.590 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: phone = 155 5555 5555
12-13 17:23:37.590 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: phone = 133 3333 3333
12-13 17:23:37.603 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: ------id=3 | name=刘备------
12-13 17:23:37.603 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: phone = 156 9637 5648
12-13 17:23:37.603 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: phone = 153 7564 8643
12-13 17:23:37.616 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: ------id=14 | name=吕布------
12-13 17:23:37.617 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: phone = 15678909087
12-13 17:23:37.630 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: ------id=20 | name=孙权------
12-13 17:23:37.630 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: phone = 15366669999
12-13 17:23:37.657 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: ------id=21 | name=曹操------
12-13 17:23:37.657 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: phone = 15699788966
12-13 17:23:37.671 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: ------id=22 | name=马超------
12-13 17:23:37.671 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: phone = 15366999966
12-13 17:23:37.712 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: ------id=23 | name=诸葛亮------
12-13 17:23:37.712 14978-14978/cn.codingblock.androidadvancestudy I/ContactProviderActivity: onCreate: phone = 13696969696

可以看到,诸葛卧龙和电话号码已经被成功添加进去了。

理所当然,除了上述几个Uri,系统的ContentProvider接口还有众多过多,就不一一举例了,用到时可以查询官方API。


末段想说的是,本体系作品为博主对Android知识展开双重梳理,查缺补漏的上学过程,一方面是对协调忘记的东西加以复习重新明白,另一方面相信在重新学习的长河中定会有巨大的新拿到,如若您也有跟自己一样的想法,不妨关心自身一头读书,互相研讨,共同提高!

参考文献:

  • 《Android开发格局探索》
  • 《Android开发进阶从小工到专家》

干货:

ContentProvider
(内容提供者)是一种共享型组件,可以为系统内利(内尔y)用于与应用之间提供访问接口。

串入读许多书的觉醒

  • ContentProvider:对外提供数据的访问接口。
  • Uri:ContentProvider的唯一标识,外界可依据其访问对应的ContentProvider。
  • ContentResolver

优:

比如说,当应用A想把温馨多少透露出来让其余应用也能够操作的话,就足以在应用A内部创设一个ContentProvider实现相关措施并添加URI,然后在其他应用中(应用B)就足以经过ContentResolver和URI来访问应用A中的ContentProvider了。

《卧虎藏龙》的侠气、《赤壁》的恢宏,《夜宴》的华丽,《风声》的控制。

ContentProvide要想正常办事索要六个关键点:

结构:

一、创制和谐的ContentProvider

  • 创建ContentProvider。

创造一个温馨的ContentProvider也很简短,同四大组件中另外的零部件类似,首先继承系统ContentProvider来创造一个类,并实现相关方法:

public class UserInfoProvider extends ContentProvider {

    static final String TAG = UserInfoProvider.class.getSimpleName();

    @Override
    public boolean onCreate() {
        Log.i(TAG, "onCreate: ");
        return false;
    }

    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) {
        Log.i(TAG, "query: ");
        return null;
    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        Log.i(TAG, "getType: ");
        return null;
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {
        Log.i(TAG, "insert: ");
        return null;
    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) {
        Log.i(TAG, "delete: ");
        return 0;
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) {
        Log.i(TAG, "update: ");
        return 0;
    }
}

下一场再 AndroidMainfest.xml 中登记并添加
authorities,这一个authorities就是传播到URI中用的,注意要将exported设为true这样外围才能访问到。

<provider
    android:name=".contentprovides.UserInfoProvider"
    android:authorities="cn.codingblock.androidadvancestudy.contentprovides.UserInfoProvider"
    android:exported="true" />

一个主干的ContentProvider创设好了,接下去要做的就是行使ContentResolver来访问它了。

  • 解析Uri

解析Uri使用Uri.parse()来分析,传入对应的参数,参数格式为:
content://authorities/ 对应于地点的UserInfoProvider来说,一个URI为:

Uri uri = Uri.parse("content://cn.codingblock.androidadvancestudy.contentprovides.UserInfoProvider/");
  • 通过Context.getContentResolver()获取ContentResolver对象。

    ContentResolver contentResolver = getContentResolver();
    

    俺们另外新建一个工程,暂且叫做TestApp吧,在那多少个新的工程里面添加一个Activity,在Activity中使用ContentResolver,通过URI来访问下边的(不同采纳中)ContentProvider。

public class UserInfoResolverActivity extends AppCompatActivity implements View.OnClickListener {

    private final static String TAG = UserInfoResolverActivity.class.getSimpleName();

    private ContentResolver contentResolver;
    private Uri uri = Uri.parse("content://cn.codingblock.androidadvancestudy.contentprovides.UserInfoProvider/");

    Button btn_insert;
    Button btn_query;
    Button btn_update;
    Button btn_delete;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_info_resolver);
        // 获取ContentResolver对象
        contentResolver = getContentResolver();

        btn_insert = (Button) findViewById(R.id.btn_insert);
        btn_query = (Button) findViewById(R.id.btn_query);
        btn_update = (Button) findViewById(R.id.btn_update);
        btn_delete = (Button) findViewById(R.id.btn_delete);

        btn_insert.setOnClickListener(this);
        btn_query.setOnClickListener(this);
        btn_update.setOnClickListener(this);
        btn_delete.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_insert:
                insert();
                break;

            case R.id.btn_query:
                query();
                break;

            case R.id.btn_update:
                update();
                break;

            case R.id.btn_delete:
                delete();
                break;
        }

    }

    public void insert() {
        Uri tempUri = contentResolver.insert(uri, values);
        Log.i(TAG, "insert: tempUri = " + tempUri);
    }

    public void query() {
        Cursor cursor = contentResolver.query(uri, null, "where", null, null);
        Log.i(TAG, "query: cursor = " + cursor);
    }

    public void update() {
        int n = contentResolver.update(uri, values, "where", null);
        Log.i(TAG, "update: n = " + n);
    }

    public void delete() {
        int n = contentResolver.delete(uri, "where", null);
        Log.i(TAG, "delete: n = " + n);
    }
}

亟需留意一点是,这些UserInfoProvider和UserInfoResolverActivity并从未在同一个利用中,UserInfoProvider在AndroidAdvanceStudy这一个应用里面,他的历程名是:cn.codingblock.androidadvancestudy。UserInfoResolverActivity在TestApp应用里面,进程名是:cn.codingblock.testapp。

在testApp点击以上的增、查、改、删按钮,log如下:

12-12 15:06:26.846 28104-28118/cn.codingblock.androidadvancestudy I/UserInfoProvider: insert: 
12-12 15:06:28.070 28104-28118/cn.codingblock.androidadvancestudy I/UserInfoProvider: query: 
12-12 15:06:29.733 28104-28118/cn.codingblock.androidadvancestudy I/UserInfoProvider: update: 
12-12 15:06:30.376 28104-28118/cn.codingblock.androidadvancestudy I/UserInfoProvider: delete: 

看,我们是在TestApp应用中做的相干操作,果然可以调用AndroidAdvanceStudy里面的UserInfoProvider。

ContenProvider就是如此简单,当然 ContentProvider
的效应远不止如此,大家也得以组合数据库或者SharePreference等实现更为扑朔迷离的对外数据操作。

江湖百戏的隆重锦绣中思考,江湖笑傲的烟雾飞舞中游荡

博古(古人的书)通今(当代的书)

引经据典,作品显的更有内涵

02.灵魂得到滋养(提倡读书不要功利,注重内心,引用有名气的人,作品,语言做例)

掩卷而思,无限的体会

墨画、桃瓣

小心修炼自己的太少了,长此以往就是过于消费自己

白岩松、水均益、柴静、汪涵等的书

03.内心更加平静(引用现代主席功成名就归隐读书的故事)

摘抄:

马未都曾经说过:人活着有三重追求,第一重是趋利,第二重是趋名,第三重是趋静。

01.感触得到充裕(多引用具体的书,诗,词,并谈到自己的清醒)

银装素裹下一叶扁舟的飘逸

对友好的威仪,对友好通晓形的能力,掌握声音、精通空间的力量、精晓表明的力量……

最后,自己的惊讶与计划

04.总结(马云的话做起来,娱乐圈的片段不佳风气拿与前文做相比,排比句写好处,又来一句做比较)

突破狭窄

闭关读书,逐步的走出来,内心更加心平气和,脚步越来越巩固

小轩窗,正梳妆,不记挂,自难忘。 —苏文忠对亡妻的感念

视野丰裕:

闲静时如姣花照水,行动处似弱柳扶风

白岩松《痛并喜欢着》

汪涵也是这么,多年前,他大病一场之后走进在靖江古镇那么些小镇上,读书、养花,拜访手艺人。重新启程,现在不仅节目主持的越来越好,人生也越加明朗,满意(达观,满意)

喜爱阅读的人,究竟能旁人强在什么地方

叶锦添,是衣衫、视觉艺术、电影美术创作书法家,更是奥斯卡(Oscar)最佳方法指导奖的唯一华人得到者。

白岩松在2000年他当选了中国十大非凡青年,2000年雅加达奥运会,白岩松参加了节目标打造

娇袭一身之玻泪光点点,娇喘微微。

翻阅,可以积累一些加上的人生厚度

《朗读者》这一个节目出的书

Kindle上阅读

严歌苓的《芳华》

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图