内容提供者---ContentProvider

她是用来为其他应用程序暴露数据,并且提供数据操作方法的一个类,就比如说是手机自带的通讯录,短信等这些应用都用contentprovider暴漏了。
需要用到一个UriMatcher,他是帮助contentprovider解析uri的,uri是统一资源标识符,就是类似网址一样的东西。

1怎么创建内容提供者

1.1创建一个类(类名最好是以Provider结尾)继承ContentProvider

public class MyContentProvider extends ContentProvider {

1.2一旦创建了内容提供者就得去清单文件注册


        <provider 
            android:name="us.mifeng.contentprovider.MyContentProvider"
            android:authorities="us.mifeng.biaogeshuaige"
            android:exported="true"
            ></provider>

1.3UriMatcher是帮助内容提供者匹配uri的一个类,需要用到uriMatcher了,创建一个UriMatcher

//创建一个urimatcher 他的意思就是如果匹配失败,返回一个-1
    private static final UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH);

1.4创建静态代码块,定义匹配规则

//创建静态代码块,定义匹配规则
    static{
        //其实是定义规则呢
        matcher.addURI("com.example.mycontentprovider.MyaContentProvider","lol/update",QUERYSUCCESS);
        matcher.addURI("com.example.mycontentprovider.MyaContentProvider","lol/queryAll",PERSON_UPDATE_CODE);   }

1.5把其他的方法实现即可(增删改查 type)
实现的时候,先把传过来的uri匹配一下,如果匹配成功就执行,如果不成功,就报异常

@Override
    public Cursor query(Uri uri, //是传进来的uri
            String[] projection,//想要查询的列名,是String数组类型
            String selection,//查询的条件
            String[] selectionArgs,//查询的条件的参数
            String sortOrder) {//按照排序的参数
        int match = matcher.match(uri);//匹配了下传进来的uri,
        //如果匹配成功就是定义好的成功吗,如果匹配失败就是-1

        //判读是否匹配成功
        if (match==QUERYSUCCESS) {
            Cursor cursor = db.query("lol",
                    projection,
                    selection,
                    selectionArgs,
                    null,
                    null,
                    sortOrder);
            return cursor;
        }
        else {
            throw new IllegalArgumentException("叫你传没用数据,报错了把!!!");
        }
    }

2.从内容提供者处拿数据。


如果你想访问contentprovider的内容,那么一定用ContentResovler内容解析者,而这个怎么获取?不是new,而是直接从上下文get。

//获取内容解析者
        ContentResolver contentResolver = getContentResolver();

2.1操作数据,就是用contentresolver来掉内容提供者定义好的方法String

str="content://us.mifeng.biaogeshuaige/lol";
        Uri uri = Uri.parse(str);

        String[] projection;
        Cursor cursor = contentResolver.query(uri,
                null,
                null,
                null,
                null);
//      if (cursor!=null&&cursor.getCount()>0) {
            while(cursor.moveToNext()){
                String hero = cursor.getString(cursor.getColumnIndex("hero"));
                String life = cursor.getString(cursor.getColumnIndex("life"));
                String type = cursor.getString(cursor.getColumnIndex("type"));
                System.out.println(hero+life+type+"hehehehehehe");
            }
//      }

搞定!!

详情代码:

创建ContentProvider的程序:

public class MyContentProvider extends ContentProvider {
    //创建一个urimatcher 他的意思就是如果匹配失败,返回一个-1
    private static final UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH);

    private static final int QUERYSUCCESS=1;
    private static final int PERSON_UPDATE_CODE=1;
    private SQLiteDatabase db;



    //创建静态代码块,定义匹配规则
    static{
        //其实是定义规则呢
        matcher.addURI("com.example.mycontentprovider.MyaContentProvider","lol/update",QUERYSUCCESS);
        matcher.addURI("com.example.mycontentprovider.MyaContentProvider","lol/queryAll",PERSON_UPDATE_CODE);   }

    @Override
    public boolean onCreate() {
        //用数据库了,参数是上下文,用getContext()得到
        BiaogeWudiOpenHelper myHelper = new BiaogeWudiOpenHelper(getContext());
        db = myHelper.getReadableDatabase();
        ContentValues values=new ContentValues();
        values.put("hero", "项羽");
        values.put("life", "5000");
        values.put("type", "团控");
        db.insert("lol", null, values);

        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public Cursor query(Uri uri, //是传进来的uri
            String[] projection,//想要查询的列名,是String数组类型
            String selection,//查询的条件
            String[] selectionArgs,//查询的条件的参数
            String sortOrder) {//按照排序的参数
        int match = matcher.match(uri);//匹配了下传进来的uri,
        //如果匹配成功就是定义好的成功吗,如果匹配失败就是-1

        //判读是否匹配成功
        if (match==QUERYSUCCESS) {
            Cursor cursor = db.query("lol",
                    projection,
                    selection,
                    selectionArgs,
                    null,
                    null,
                    sortOrder);
            return cursor;
        }
        else {
            throw new IllegalArgumentException("叫你传没用数据,报错了把!!!");
        }
    }

    @Override
    public String getType(Uri uri) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        // TODO Auto-generated method stub
        int match = matcher.match(uri);
        if(match==PERSON_UPDATE_CODE){
            int count=db.update("lol",values,selection,selectionArgs);
            return count;
        }
        else {
            throw new IllegalArgumentException("uri不匹配"+uri);
        }
    }

}

数据库:

public class BiaogeWudiOpenHelper extends SQLiteOpenHelper {

    public BiaogeWudiOpenHelper(Context context) {
        super(context, "biaogewudi.db", null, 1);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(
            "create table lol(id integer primary key autoincrement,hero varchar[20],life varchar[20],type varchar[20])");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub

    }

}

获取ContentProvider的程序

public class MainActivity extends Activity {

    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button cha=(Button) findViewById(R.id.cha);
        Button gai=(Button) findViewById(R.id.gai);
        cha.setOnClickListener(this);
        gai.setOnClickListener(this);
        //得到内容解析者
        contentResolver = getContentResolver();
    }
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
        case R.id.cha:
            String str="content://com.example.mycontentprovider.MyaContentProvider/lol/queryAll";
            Uri uri = Uri.parse(str);
            Cursor cursor = contentResolver.query(uri,
                    null,
                    null,
                    null,
                    null);
            while(cursor.moveToNext()){
                String hero = cursor.getString(cursor.getColumnIndex("hero"));
                String life = cursor.getString(cursor.getColumnIndex("life"));
                String type = cursor.getString(cursor.getColumnIndex("type"));
                System.out.println(hero+life+type+"hehehehehehe");
            }
            break;
        case R.id.gai:
            String strs="content://com.example.mycontentprovider.MyaContentProvider/lol/update";
            Uri urii = Uri.parse(strs);
            ContentValues contentValues = new ContentValues();
            contentValues.put("hero", "项羽");
            contentValues.put("life", "5000");
            contentValues.put("type", "酱油");
            contentResolver.update(urii, contentValues, "hero=?", new String[]{"项羽"});
            break;
        default:
            break;
        }
    }
}

参考网址:http://blog.csdn.net/ibey0nd/article/details/38171089

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值