android_内容提供者和内容解析者_简单入门

ContentProvider 内容提供者

一般来说,应用程序创建的数据库只有自己才可以进行读写操作,其他的应用程序不具备这样的权利。但是如果真的想把数据库里面的数据暴露出去,供其他的程序进行CURD操作,那么这个时候就用到了ContentProvider

那这个ContentProvider是怎么工作的?现在我们解释一下,
这个ContentProvider是怎么工作的

现在图形化解释一下这个概念:

这里写图片描述

如果银行行长想要去拿银行里面的钱,但是钱是放在保险库里面的,行长是没有办法直接拿到里面的钱的,但是,保险库里面也有内部人员,只要银行行长和内部人员打交道,通过内部人员,拿钱。这样行长就可以拿到钱了。
在这里钱:表示数据库 内部人员:内容提供者 银行行长:就是外部的APP程序

建立内容提供者

第一步:写一个类继续ContentProvider
第二步:在清单文件里面注册,同时要记得叫上authorities(我们把叫做口令)
在这里解释一下authorities的作用,因为别人来访问我们的内容提供,我们不能让任何的APP过来,都是可以访问我的,所以我们内容提供者就设置了一个口令,只有口令输入对了,才可以访问。(注意:直接设置这么一个口令还是不够的,待会后面我会详细的介绍一下)

代码演示内容提供者:

首先我规定一下:这个应用程序的包名是com.exam.bank
第一步:

public class BankBackDoor extends ContentProvider {

/**
继承之后,发现有四个6个方法,给我们重写,
其中query,insert,update,delete就是对应数据库的
CRUD的方法,同时这个四个方法也对应这内容解析者的query,insert,update,delete,
内容解析者,通过调用自己的CRUD,就可以操作内容提供者的CRUD,
内容通过自己的CRUD又可以去操作自己数据库的CRUD,

所以说:
有一个核心: 到底修改什么数据,执行什么数据插入, 查询,删除,都不能由我们做主,因为我们只是一个跑腿。 我们不生产数据,我们只是数据的搬运工。
*/
    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
            Log.v("tag", "query");
            return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
            Log.v("tag", "insert");     
            return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        Log.v("tag", "delete");
        return i;
    }

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

    @Override
    public boolean onCreate() {
        return false;
    }

    @Override
    public String getType(Uri uri) {
        return null;
    }

}

第二步:

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.exam.bank.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <provider
            android:name="com.exam.bank.BankBackDoor"
            android:authorities="com.exam.bank.BankBackDoor"
            ><!--设置口令-->
        </provider>
    </application>

这样一个内容提供者我们就写好了.

现在我们设置一下内容解析者把

首先我规定一下这个应用程序的包名是:com.example.bangkBoss

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void insert(View v){
        //获取内容解析者
        ContentResolver   resolver=getContentResolver();
        //设置Uri,Uri解析的路径就是内容提供者对外暴漏的口令.
        //content://是固定好的,
        //com.exam.bank.BankBackDoor内容提供者设置的口令
        Uri   uri =Uri.parse("content://com.exam.bank.BankBackDoor");
        ContentValues  values=new ContentValues();
/**调用内容解析者里面的方法,只要我们使用insert方法,
这个方法就会去操作内容提供者里面的insert方法,
而内容提供者而就会调用自己内部的方法(就会去操作数据库).
这样通过这样的调用,
外部的APP就可以访问,其他APP的数据库了
*/      
        resolver.insert(uri, values);
    }


    public void delete(View v){
        ContentResolver   resolver=getContentResolver();
        Uri   uri =Uri.parse("content://com.exam.bank.BankBackDoor");
        resolver.delete(uri, null, null);
    }


    public void update(View v){
        ContentResolver   resolver=getContentResolver();
        Uri   uri =Uri.parse("content://com.exam.bank.BankBackDoor");
        ContentValues  values=new ContentValues();
        resolver.update(uri, values, null, null);
    }


    public void select(View v){
        ContentResolver   resolver=getContentResolver();
        Uri   uri =Uri.parse("content://com.exam.bank.BankBackDoor");
        resolver.query(uri, null, null, null, null);
    }

}

一些定义的解析:

Uri 在java基础我们知道是资源定位符,在这里,我们就用来匹配口令的,这个口令是内容提供者写好。我们只要和内容提供者的提供的口令一致就可以的了,content://
指的是规则,例如http://www.baidu.com一样,符合http://规则。content://
就是我们这里口令的规则,这个是定义死的。记住就行了。
Resolver,里面就有insert(),updata(),delete(),query()等方法,他们都是对应着内容提供者的方法。所以我们内容解析者操作自己里面的方法,就可以执行到内容提供者里面的方法。

ContentValues 这个参数,其实就是用来存储数据的,是键值对的形式存在的。在SQLite里面有详细的介绍
后面会演示的

阅读更多
换一批

没有更多推荐了,返回首页