内容提供器Demo

创建自己的内容提供器

  • 通过新建一个类继承自ContentProvider的方式来创建一个自己的内容提供器
  • 并实现它 6 个抽象方法。
  • onCreate()方法。 初始化内容提供器的时候调用。通常会在这里完成对数据库
  • 的创建和升级操作,返回true,表示内容初始化成功,返回false,表示内容初
  • 始化失败。只有当存在ContentResolver尝试访问我们程序的时,内容提供器
  • 才会被初始化。

  • query(*)*从内容提供器中查询数据,uri参数来确定查询那张表,查询的结果存

  • 放在cursor中返回。
  • insert()方法,向内容提供器中添加数据,将添加的数据保存在values中,
  • 并返回这条新纪录的uri
  • delete()根据传入的内容URI,l确定删除哪一行。被删除的行数将作为
  • 返回值返回。

  • getType()根据传入的uri来返回相应的MIME类型,一个内容URI对应的

  • MIME字符串主要有三部分组成,
  • 必须以vnd开头
  • 如果内容URI以路径结尾,则后接android.cursor.dir/,如果内容URI以id结尾
  • 则后接上android.cursor.item/。
  • 最后接上vnd.< authority>.< path>

  • 对于

  • content://com.xiaoxu.administrator.save2doc.contentprovider/Country
  • 这个内容URI,它对用的MIME类型为
  • vnd.android.cursor.dir/vnd.com.xiaoxu.administrator.save2doc.contentprovider.Country”
    • Demo
package com.xiaoxu.administrator.save2doc.contentprovider;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.support.annotation.Nullable;

import com.xiaoxu.administrator.save2doc.DataHelper;
/** * Created by Administrator on 2016/4/19. */
public class CountryProvider extends ContentProvider {

    SQLiteOpenHelper sqLiteOpenHelper;
    static UriMatcher uriMatcher;
    private static final String AUTHORITY = "com.xiaoxu.administrator.save2doc.contentprovider";
    //定义静态常量,表示要访问Country表中的全部数据,或者是单条数据。
    private static final int COUNRY_DIR = 0;
    private static final int COUNRY_ITEM = 1;

    static {
        //将UriMatcher初始化,将希望匹配的集中uri类型添加进去,参数1 权限,参数2 要访问表的path, 参数3 访问的类型。
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        uriMatcher.addURI(AUTHORITY, "Country", COUNRY_DIR);
        uriMatcher.addURI(AUTHORITY, "Country/#", COUNRY_ITEM);
    }
    @Override
    public boolean onCreate() {
    //创建DatabaseHelpter的实例,返回true表示初始化成功,这时数据库已经完成了创建和升级。
        sqLiteOpenHelper = new DataHelper(getContext(), "CountryInfo", null, 1);

        return true;
    }
    @Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        SQLiteDatabase db = sqLiteOpenHelper.getReadableDatabase();
        Cursor cursor = null;
        //获取传入的uri 的要访问的类型。
        switch (uriMatcher.match(uri)) {
            case COUNRY_DIR:

                cursor = db.query("Country", projection, selection, selectionArgs, null, null, sortOrder);
                break;
            case COUNRY_ITEM:

                String countryId = uri.getPathSegments().get(1);
                cursor = db.query("Country", projection, "id = ?", new String[]{countryId}, null, null, sortOrder);
                break;
        }

        return cursor;
    }

    @Nullable
    @Override
    public String getType(Uri uri) {

        switch (uriMatcher.match(uri)){
            case COUNRY_DIR:

                return "vnd.android.cursor.dir/vnd.com.xiaoxu.administrator.save2doc.contentprovider.Country" ;
            case COUNRY_ITEM:

                return "vnd.android.cursor.item/vnd.com.xiaoxu.administrator.save2doc.contentprovider.Country" ;
        }

        return null;
    }

    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        SQLiteDatabase db = sqLiteOpenHelper.getWritableDatabase();
        Uri uriReturn = null;

        switch (uriMatcher.match(uri)) {

            case COUNRY_DIR:
            case COUNRY_ITEM:
                //得到新增数据的ID
                Long newCountryId = db.insert("Country", null, values);
                //拼接字符串将新的uri对象返回。
                uriReturn = Uri.parse("content://" + AUTHORITY + "/Country/" + newCountryId);

                break;

        }
        return uriReturn;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {

        SQLiteDatabase db = sqLiteOpenHelper.getWritableDatabase();
        int deleteLine = 0;
        switch (uriMatcher.match(uri)) {

            case COUNRY_DIR:
                deleteLine = db.delete("Country", selection, selectionArgs);
                break;
            case COUNRY_ITEM:
                //uri.getPathSegments(),它会将权限后面的部分以/分隔,并把分割后的结果存放到字符串表中,第0位 是路径,第1位 是id
                String ItemId = uri.getPathSegments().get(1);
                deleteLine = db.delete("Country", "id = ?", new String[]{ItemId});

                break;
        }

        return deleteLine;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {

        SQLiteDatabase db = sqLiteOpenHelper.getWritableDatabase();
        int newId = 0;

        switch (uriMatcher.match(uri)) {

            case COUNRY_DIR:

                newId = db.update("Country", values, selection, selectionArgs);
                break;
            case COUNRY_ITEM:
//uri.getPathSegments(),它会将权限后面的部分以/分隔,并把分割后的结果存放到字符串表中,第0位 是路径,第1位 是要查询的行数 id
                String updateId = uri.getPathSegments().get(1);
                newId = db.update("Country", values, "id = ?", new String[]{updateId});
                break;

        }
        return newId;
    }
}
  • 不要忘记在Android中注册,
<provider  android:authorities="com.xiaoxu.administrator.save2doc.contentprovider" android:name=".contentprovider.CountryProvider" android:exported="true"/>
  1. android:authorities 指定ContentProvider对应的UIR
  2. android:name ContentProvider实现类的类名
  3. android:exported 可以被其他程序访问

  4. 接下来新建一个项目B来获取项目A中的表中的数据。

 Uri uri = Uri.parse("content://com.xiaoxu.administrator.save2doc.contentprovider/Country");

                    Cursor cursor = MainActivity.this.getContentResolver().query(uri,null,null,null,null);
                    StringBuilder builder = new StringBuilder();

                    if(cursor != null){
                        while (cursor.moveToNext()){

                            String countryName = cursor.getString(cursor.getColumnIndex("name"));
                            builder.append(countryName +"\n");
                        }
 Uri itemUri = Uri.parse("content://com.xiaoxu.administrator.save2doc.contentprovider/Country/4");

                    Cursor itemCursor = MainActivity.this.getContentResolver().query(itemUri,null,null,null,null);

                    StringBuilder areaBuild = new StringBuilder();
                    if(itemCursor != null){

                        while (itemCursor.moveToNext()){
                            areaBuild.append(itemCursor.getInt(itemCursor.getColumnIndex("area")) +"\n");
                        }

                        queryAreaTv.setText(areaBuild.toString());
                    }
  • Uri.parse()的参数中,系统就是根据指定的com.xiaoxu.administrator.save2doc.contentprovider
  • 来确定访问哪个应用下的内容提供器,如果访问的是同一个应用,
  • 该值是不变的。Country 表示要访问的表名,是可以动态改变的。

结果 获取到了列名为 name列的数据。

  1. 第一个TextView里的数据就是访问A项目得到的,name列的值。
  2. 第二个TextView 值 1030 就是指定查询第四列 列名为area的值得到的。

内容提供器Demo_第1张图片

你可能感兴趣的:(内容提供器)