zoukankan      html  css  js  c++  java
  • 入门篇:9.组件4:ContentProvider(内容提供者)

    android 四大基本组件 的ContentProvider(内容提供者) 这个组件其实就是一个应用进行数据或数据库提供、共享其他应用获取数据的组件,其大致的结构图如下:

    其中uri是一个重要的中间媒介。

    联系到我们平时用的安卓程序,最常见的就是通讯录。在我们的安卓手机里,通讯录的设计其实是两个程序,其中有一个程序没有用户界面,单纯的存储着联系人信息,并且数据库结构复杂,这也是为了保证数据的安全。另外一个程序就是我们可以看见的通讯录程序。那么第一个程序就是一个ContentProvider,用于提供数据,而通讯录这个安卓手机内置软件,便是对ContentProvider所提供的程序进行增删改查。

    如果我们想要自己写一个ContentProvider,就要自定义类去继承ContentProvider,并实现其中的方法,我们自定义的这个ContentProvider用于给其他应用或程序提供数据。这个类的具体结构和其中的方法代码如下,各个方法的含义在注释中可见:

    import android.content.ContentProvider;
    import android.content.ContentValues;
    import android.database.Cursor;
    import android.net.Uri;
    import android.support.annotation.Nullable;
    
    /**
     * Created by lzc on 16/6/22.
     */
    public class MyContentProvider extends ContentProvider {
    
        @Override
        public boolean onCreate() {//在创建ContentProvider时调用
            return false;
        }
    
        @Nullable
        @Override
        public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1) {//根据uri查询出selection制定的条件所匹配的全部纪录,并且可以指定查询那些列以什么方式(order)排序
            return null;
        }
    
        @Nullable
        @Override
        public String getType(Uri uri) {//返回当前uri的MIME类型,如果该uri对应的数据可能包括多条记录
            //那么MIME类型字符串就是vnd.android.dir/开头
            //如果该URI对应的数据只有一条记录,该MIME类型字符串就是 以vnd.android.crusor.item/开头
            return null;
        }
    
        @Nullable
        @Override
        public Uri insert(Uri uri, ContentValues contentValues) {//根据uri插入Values对应的纪录
            return null;
        }
    
        @Override
        public int delete(Uri uri, String s, String[] strings) {//根据uri删除selection指定的条件所匹配的全部记录
            return 0;
        }
    
        @Override
        public int update(Uri uri, ContentValues contentValues, String s, String[] strings) {//根据uri修改selection指定的条件所匹配的全部记录
            return 0;
        }
    }

    这个ContentProvider在实际应用中我们不常去自己定义,更多的时候我们只是使用系统,或其他应用的ContentProvider。

    这里写一个简单的应用,功能是实现查看手机内的通讯录信息。

    代码如下:

    import android.content.ContentResolver;
    import android.content.CursorLoader;
    import android.database.Cursor;
    import android.provider.ContactsContract;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ContentResolver cr = getContentResolver();
    
            Cursor c = cr.query(ContactsContract.Contacts.CONTENT_URI,new String[]{ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME},null,null,null);
            if(c!=null){
                while(c.moveToNext()){
                    int id = c.getInt(c.getColumnIndex("_ID"));
                    System.out.println("id="+id);
                    String name = c.getString(c.getColumnIndex("DISPLAY_NAME"));
                    System.out.println("name:"+name);
                     Cursor c1 = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.TYPE}, ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+id,null,null);
                        if(c1!=null){
                            while (c1.moveToNext()){
                                int type = c1.getInt(c1.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
                                 if(type == ContactsContract.CommonDataKinds.Phone.TYPE_HOME)
                                    Log.i("info","家庭电话:"+c1.getString(c1.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
                                 else{
                                     Log.i("info","手机:"+c1.getString(c1.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
                                 }
    
    
                            }
                        }
                    c1.close();
                }
    
            }
            c.close();
    
        }
    }

    注意:这里需要一个用户权限:

    <uses-permission android:name="android.permission.READ_CONTACTS"/>

    在写一个简单的应用功能为在手机通讯录中插入一条信息。

    代码如下:

    import android.content.ContentResolver;
    import android.content.ContentUris;
    import android.content.ContentValues;
    import android.net.Uri;
    import android.provider.ContactsContract;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ContentResolver cr = getContentResolver();
    
            //插入一行数据
            ContentValues valuse = new ContentValues();
            Uri uri = cr.insert(ContactsContract.RawContacts.CONTENT_URI,valuse);
            Long raw_contact_id = ContentUris.parseId(uri);
            valuse.clear();
            //插入人名
            valuse.put(ContactsContract.CommonDataKinds.StructuredName.RAW_CONTACT_ID,raw_contact_id);
            valuse.put(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,"安卓入门进阶");
            valuse.put(ContactsContract.CommonDataKinds.StructuredName.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
            uri = cr.insert(ContactsContract.Data.CONTENT_URI,valuse);
            //插入电话信息
            valuse.clear();
            valuse.put(ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID,raw_contact_id);
            valuse.put(ContactsContract.CommonDataKinds.Phone.NUMBER,"131111111111");
            valuse.put(ContactsContract.CommonDataKinds.Phone.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
            uri = cr.insert(ContactsContract.Data.CONTENT_URI,valuse);
        }
    }

    注意:需要的用户权限为:

        <uses-permission android:name="android.permission.READ_CONTACTS"/>
        <uses-permission android:name="android.permission.WRITE_CONTACTS"/>

    一般系统提供的ContentProvider包括:

    -查询联系人

    -增加联系人

    -短信的读取

    -通话记录

    -多媒体 图片视频音频

    至此,安卓开发的四大基本组件,大结局!

  • 相关阅读:
    ecshop 商品分类下的销售排行
    ecshop批量清除商品的精品新品热销属性
    ECSHOP二次开发之给商品增加新字段
    ECSHOP首页调用文章内的缩略图
    ECSHOP给分类添加代表图
    ECSHOP首页促销商品下显示促销时间
    鼠标点击后更换背景
    ECSHOP如何修改商品评论或留言的日期
    ECSHOP设置指定IP才能登录后台
    ecshop远程图片本地化保存相册图片
  • 原文地址:https://www.cnblogs.com/androidNot/p/5609047.html
Copyright © 2011-2022 走看看