android之ContentProvider详解

 一,ContentProvider介绍

         ContentProvider内容提供者,是androidAPP四大组件之一。是一种数据存贮访问通道,在你无需了解存储细节的时候就可以方便的访问数据。为什么会有这样的机制呢?在android中没有提供一个公共区域供不同的程序共享访问。我们知道android系统是基于Linux系统的,我们的每一个程序都有独立的账户,拥有独立的虚拟机。我们的android提供了SQLite数据库作为数据存储,但是只能够程序本身访问,试想一下如果我们要写一段发短信的程序,这个时候我们需要访问通讯录存储的联系人那么我们应该怎么办呢?这个时候就可以使用ContentProvider的机制来实现。另外,ContentProvider在系统启动的时候就会自动实例化,无需等待被调用的程序启动我们就可以访问它的数据。

        这就是ContentProvider所设计的作用。ContentProvider可以帮助我们安全的实现进程间数据的访问,也是唯一的进程间数据访问的方式(注意和IPC进程间通讯区分,这里的数据主要是指磁盘数据)。

    1,实现原理示意图

   android之ContentProvider详解_第1张图片

        2,返回的数据模型示意图,返回一个Cursor对象,就是下面的表。

     android之ContentProvider详解_第2张图片

   二,如何使用

     1,uri解释 

              第一部分content://固定的标示

              第二部分com.lijp.provider.*/在mainfest文件中配置的路径,相当于数据库的路径

              第三部分,person相当于访问数据库的表明

              第四部分,相当于表的id

       

    2,自定义一个类,继承自系统的ContentProvider

         

package com.example.cdy.myapplication;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.widget.Toast;


/**
 * Created by cdy on 2015/12/13.
 * 定义自己的ContentProvider
 * 1,继承系统的ContentProvider类
 * 2,实现父类的方法
 */
public class MyContentProvider extends ContentProvider {


    public boolean onCreate() {
        return false;
    }


    /*
    *查询方法,返回一个Cursor对象,
    * uri:在manifest文件中注册的地址。 android:authorities="com.example.cdy"
    * projection:一组查询的列名
    * selection: 查询的条件
    * selectionArgs:查询的条件参数
    * sortOrder:排序
    * */
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        Toast.makeText(getContext(),"打印结果",Toast.LENGTH_LONG).show();
        return null;
    }


    /*
    * 返回指定uri的数据类型
    * */
    public String getType(Uri uri) {
        return null;
    }


    /*
    *插入指定uri的数据
    * values:插入的数据
    * */
    public Uri insert(Uri uri, ContentValues values) {
        return null;
    }


    /*
    * 删除指定uri的数据
    * selection:删除的条件
    * selectionArgs:删除的条件参数
    * */
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }

   /*
   * 更新指定uri的数据
   * values:需要更新的数据
   * selection:更新的条件
   * selectionArgs:更新的条件参数
   * */
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        return 0;
    }
}
    3,在mainfest.xml中注册

    

 <!--在Manifest中注册定义的ContentProvider
            authorities:提供访问的地址
            name:定义的类名的项目地址,<package>.<class.name>我这里开发使用的android studio自动识别-->
        <provider
            android:authorities="com.example.cdy"
            android:name=".MyContentProvider">

        </provider>
   4,使用系统提供的ContentResolver调用定义的provider

      

   button = (Button)findViewById(R.id.test_provider);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /*
                * 系统提供了resolver,供我们调用provider
                * */
                ContentResolver resolver = getContentResolver();
                Cursor cursor = resolver.query(Uri.parse("content://com.example.cdy"),null,null,null,null);

            }
        });
    5,界面输出了定义的MyContentProvider中Query方法中提示的语句。

      android之ContentProvider详解_第3张图片

你可能感兴趣的:(android,ContentProvider)