Android四大组件之一内容提供者

ContentProvider:内容提供者的作用就是把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用。
一. 自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查数据库的代码。

public Uri insert(Uri uri, ContentValues values) {
            db.insert("person", null, values);
            return uri;
    }

二. 在清单文件中定义内容提供者的标签,注意必须要有authorities属性,这是内容提供者的主机名,功能类似地址

<provider android:name="com.itheima.contentprovider.PersonProvider"
            android:authorities="com.itheima.person"
            android:exported="true"
         ></provider>

三.创建一个其他应用,访问自定义的内容提供者,实现对数据库的插入操作

public void click(View v){
            //得到内容分解器对象
            ContentResolver cr = getContentResolver();
            ContentValues cv = new ContentValues();
            cv.put("name", "小方");
            cv.put("phone", 138856);
            cv.put("money", 3000);
            //url:内容提供者的主机名
            cr.insert(Uri.parse("content://com.itheima.person"), cv);
        }

四.uri携带数据,数据包括表名或者数字,字符串等。
a)添加匹配规则

//创建uri匹配对象
    static UriMatcher um = new UriMatcher(UriMatcher.NO_MATCH);
    //检查其他用户传入的uri与匹配器定义好的uri中,哪条匹配
    static {
        um.addURI("com.example.people", "person", 1);//content://com.example.people/person
        um.addURI("com.example.people", "teacher", 2);//content://com.example.people/teacher
        um.addURI("com.example.people", "person/#", 3);//content://com.example.people/teacher/3
    }

b)通过Uri匹配器可以实现操作不同的表

public int delete(Uri uri, String selection, String[] selectionArgs) {
        int i;
        if(um.match(uri) == 1){
             i = db.delete("person", selection, selectionArgs);
        }else if(um.match(uri) == 2){
             i = db.delete("teacher", selection, selectionArgs);
        }else{
            throw new IllegalArgumentException("uri有问题");
        }
        return i;
    }

c)如果路径中带有数字,把数字提取出来

if(um.match(uri) == 3){
            //把uri末尾携带的数字取出来
            long id = ContentUris.parseId(uri);
            cursor = db.query( "person", projection, "_id = ?", new String[]{id+""}, null, null, sortOrder, null);
        }

代码实例
自定义内容提供者这里写图片描述

package com.example.provider;

import com.example.lzz.MyOpenHelper;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;

public class PersonProvider extends ContentProvider {
    private MyOpenHelper oh;
    SQLiteDatabase db;
    //创建uri匹配对象
    static UriMatcher um = new UriMatcher(UriMatcher.NO_MATCH);
    //检查其他用户传入的uri与匹配器定义好的uri中,哪条匹配
    static {
        um.addURI("com.example.people", "person", 1);//content://com.example.people/person
        um.addURI("com.example.people", "teacher", 2);//content://com.example.people/teacher
        um.addURI("com.example.people", "person/#", 3);//content://com.example.people/teacher/3
    }
    //内容提供者创建时调用
    @Override
    public boolean onCreate() {
        // TODO Auto-generated method stub
        oh = new MyOpenHelper(getContext());
        db = oh.getWritableDatabase();
        return false;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        // TODO Auto-generated method stub
        Cursor cursor = null;
        if(um.match(uri) == 1){
            cursor = db.query( "person", projection, selection, selectionArgs, null, null, sortOrder, null);
        }else if(um.match(uri) == 2){
            cursor = db.query( "teacher", projection, selection, selectionArgs, null, null, sortOrder, null);
        }else if(um.match(uri) == 3){
            //把uri末尾携带的数字取出来
            long id = ContentUris.parseId(uri);
            cursor = db.query( "person", projection, "_id = ?", new String[]{id+""}, null, null, sortOrder, null);
        }
        else{
            throw new IllegalArgumentException("uri有问题");
        }

        return cursor;
    }

    @Override
    public String getType(Uri uri) {
        // TODO Auto-generated method stub
        return null;
    }
    //此方法供其他应用调用,用于往people数据库插入数据
    //values由其他应用传入,用于封装要插入的数据
    //uri:内容提供者的主机名也就是访问地址
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        //使用uri匹配器匹配传入的uri
        if(um.match(uri) == 1){
            db.insert("person", null, values);
        }else if(um.match(uri) == 2){
            db.insert("teacher", null, values);
        }else{
            throw new IllegalArgumentException("uri有问题");
        }


        return uri;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        int i;
        if(um.match(uri) == 1){
             i = db.delete("person", selection, selectionArgs);
        }else if(um.match(uri) == 2){
             i = db.delete("teacher", selection, selectionArgs);
        }else{
            throw new IllegalArgumentException("uri有问题");
        }
        return i;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        int i = db.update("person", values, selection, selectionArgs);
        if(um.match(uri) == 1){
            i = db.update("person", values, selection, selectionArgs);
        }else if(um.match(uri) == 2){
            i = db.update("teacher", values, selection, selectionArgs);
        }else{
            throw new IllegalArgumentException("uri有问题");
        }
        return i;
    }

}

访问自定义内容提供者这里写图片描述

package com.example.visitprovider;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;


public class MainActivity extends Activity {

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


   public void insert(View v){
       //通过内容提供者把数据插入people数据库
       //拿到contentResolver
       ContentResolver cr = getContentResolver();
       ContentValues values = new ContentValues();
       values.put("name", "校长");
       values.put("money", "13333");
       //uri:内容提供者的主机名
       //values要插入的数据

       cr.insert(Uri.parse("content://com.example.people/teacher"), values);
       values.put("name", "张老师");
       values.put("money", "33333");
       cr.insert(Uri.parse("content://com.example.people/teacher"), values);
       values.put("name", "李老师");
       values.put("money", "123456");
       cr.insert(Uri.parse("content://com.example.peopleteacher/teacher"), values);
   }
   public void delete(View v){
       ContentResolver cr = getContentResolver();
       cr.delete(Uri.parse("content://com.example.people/person"), "name = ?", new String[]{"校长"});
   }
   public void updata(View v){
       ContentResolver cr = getContentResolver();
       ContentValues values = new ContentValues();
       values.put("name", "新张三");
       int i = cr.update(Uri.parse("content://com.example.people/person"), values,"name = ?", new String[]{"张三"});
       System.out.println(i);
   }
   public void select(View v){
       ContentResolver cr = getContentResolver();
       Cursor cursor = cr.query(Uri.parse("content://com.example.people/person/4"), null, null, null, null);
       while(cursor.moveToNext()){
           String name = cursor.getString(1);
           String money = cursor.getString(2);
           System.out.println("name:"+name+"money:"+money);
       }
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值