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包括:

    -查询联系人

    -增加联系人

    -短信的读取

    -通话记录

    -多媒体 图片视频音频

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

  • 相关阅读:
    强化学习的基本迭代方法
    基于文本描述的事务聚类
    学习强化学习之前需要掌握的3种技能
    其它 华硕 ASAU S4100U 系统安装 win10安装 重装系统 Invalid Partition Table 解决
    数据分析 一些基本的知识
    Python 取样式的内容 合并多个文件的样式 自定义样式
    电商 Python 生成补单公司需要的评论格式3
    SpringBlade 本地图片上传 生成缩略图
    SQL Server 字符串截取
    SpringBlade 本地图片上传
  • 原文地址:https://www.cnblogs.com/androidNot/p/5609047.html
Copyright © 2011-2022 走看看