内容提供器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的值得到的。

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值