入门篇: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包括:

-查询联系人

-增加联系人

-短信的读取

-通话记录

-多媒体 图片视频音频

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

原文地址:https://www.cnblogs.com/androidNot/p/5609047.html