Android Content Provider简介

  Content Provider是Android的四大组件之一,与Activity和Service相同,使用之前需要注册;

  Android系统中存在大量的应用,当不同的应用程序之间需要共享数据时,可以使用Content Provider来实现,因为它为存储和读取数据提供了统一的接口;

 

(1)Android系统内置的许多数据都是使用Content Provider,然后供开发者调用,如音频,视频,图片,通讯录等;

(2)当一个程序需要把自己的数据暴露给其他程序使用时,该程序就可以通过提供Content Provider来实现,而其他程序就可以通过ContentResolver来操作Content Provider暴露的数据;

(3)应用程序通过ContentProvider开放了自己的数据,该应用程序不需要启动,其他应用程序都可以操作开放的数据,包括增删改查操作;

(4)当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。

 

ContentProvider类的使用步骤

1、自定义MyProvider extends ContentProvider子类,在该类中重写用于增删改查的操作;

2、在AndroidManifest.xml中注册该类;

3、设定共享数据的uri地址;

4、在其它类或其他项目中调用ContentResolver对象中的增删改查方法,按uri提供的地址对数据进行操作;

 

例如:获取系统的手机的通讯录;

 

 

代码其实很简单,因为我们没有自定义我们的Content Provider类,所以只使用ContentResolver来操作数据就行了;

package com.xiaozhang.contentprovidertest;

import android.app.Activity;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.PhoneLookup;
import android.database.Cursor;
import android.graphics.Color;
import android.widget.TextView;
import android.content.ContentResolver;

public class MainActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        TextView textView = new TextView(this);
        String string = getQueryData();
        textView.setTextColor(Color.GRAY);
        textView.setText(string);
        textView.setTextSize(20.0f);
        setContentView(textView);
    }

    public String getQueryData() {

        String string = "";
        int id = 1;
        // 得到ContentResolver对象
        ContentResolver cr = getContentResolver();
        // 获取电话本中开始的游标
        Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
                null, null, null);
        // 向下移动
        while (cursor.moveToNext()) {
            // 取得联系人名字
            int nameFieldColumnIndex = cursor
                    .getColumnIndex(PhoneLookup.DISPLAY_NAME);
            String contact = cursor.getString(nameFieldColumnIndex);
            // 取得电话号码
            String ContactId = cursor.getString(cursor
                    .getColumnIndex(ContactsContract.Contacts._ID));
            Cursor phone = cr.query(
                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "="
                            + ContactId, null, null);
            while (phone.moveToNext()) {
                String PhoneNumber = phone
                        .getString(phone
                                .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                string += (id + "-----" + contact + "-----" + PhoneNumber + "\n");
                id++;
            }
        }
        cursor.close();
        return string;
    }
}

然后在AndroidManifest.xml中添加权限;

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

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。