思维导图:

android FileProvider 提供者和接受者_内容提供者

一、什么是内容提供者?

ContentProvider(内容提供者)是android中的四大组件之一。ContentProvider为不同的软件之间数据共享,提供统一的接口。

ContentProvider是以类似数据库中表的方式将数据暴露,也就是说ContentProvider就像一个“数据库”。那么外界获取其提供的数

据,也就应该与从数据库中获取数据的操作基本一样,只不过是采用URI来表示外界需要访问的“数据库”。ContentProvider定义一

个对外开放的接口,从而使得其他的应用可以使用我们自己应用中的文件、数据库内存储的信息。实际开发过程中并不是很常用,

Android系统中的信息,图片库,联系人常用到,但谷歌工程师已经帮我封装好了,我们只需要访问即可。

  

 

二、为什么会有内容提供者?

          内容提供者向其它的应用程序提供了一个数据访问的方式,这种方式相对于文件存储共享和sharedpreferences共享数据而言

的话,它提供了一个统一的数据访问方式,更方便更有效。

 三、如何创建一个内容提供者?

  

首先:写一个类继承Contentprovider,重写六个方法如下实例所示

其次:在AndroidManifest.xml的<application>节点下配置<provider>指定name和authorities属性

实例:

package com.sun.administrator.sqlite;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;

import com.zking.db.DBHelper;

/**
 * Created by Administrator on 2017/7/17 0017.
 */

public class MyProvider extends ContentProvider {
    @Override
    public boolean onCreate() {
        Log.i("test","onCreate");
        return false;
    }

    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
        Log.i("test","query");

        //把数据查询出来
        DBHelper dbHelper=new DBHelper(getContext(),"test.db",null,1);
        SQLiteDatabase sqLiteDatabase=dbHelper.getReadableDatabase();
        //sqLiteDatabase.rawQuery("select * from login",null);
        return sqLiteDatabase.rawQuery("select * from login",null);
    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        Log.i("test","getType");
        return null;
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        Log.i("test","insert");
        return null;
    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
        Log.i("test","delete");
        return 0;
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
        Log.i("test","update");
        return 0;
    }
}

配置信息:

<!--配置内容提供者-->
        <provider
            android:authorities="com.sun.administrator.sqlite.LOGIN"
            android:name=".MyProvider"
            android:exported="true"
            ></provider>

四、如何进行访问?

 第一步:安装访问的应用程序

 第二步:获取解析器ContentResolver

 第三步:通过解析器调取insert(), delete(), update(), query()方法访问Uri关联的ContentProvider

实例:

package com.sun.administrator.contentresolver;

import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
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();
        Uri uri=Uri.parse("content://com.sun.administrator.sqlite.LOGIN");
        Cursor cursor=cr.query(uri,null,null,null,null);
        while(cursor.moveToNext()){
           int uid=cursor.getInt(cursor.getColumnIndex("uid"));
            String uname=cursor.getString(cursor.getColumnIndex("uname")) ;
            String upass=cursor.getString(cursor.getColumnIndex("upass")) ;
            Log.i("test",uid+" "+uname+" "+upass);
        }
    }
}

 小结: ①  ContentProvider将应用中的数据对其它应用进行共享, 提供增删改查的方法  

      ②  ContentProvider将数据封装,只暴露出我们希望提供给其它程序的数据  

      ③  ContentProvider统一了数据的访问方式,不必针对不同数据类型采取不同的访问策略  

      ④  ContentProvider中可以注册观察者, 监听数据的变化  

 注意:1、配置信息中name 是完整的类名

     2、authorities是访问Provider时的路径,一定要唯一