Android四大组件之内容提供者--ContentProvider

ContetProvider:一般为存储和获取数据提供统一的接口,可以在不同的应用程序之间共享数据

        1、ContentProvider是用表的形式来组织数据
       2、ContentProvider提供的方法
   query:查询
   insert:插入
   update:修改
   delete:删除
   getType:获取到数据类型
   onCreate:创建数据时调用的回调函数
  3、ContentProvider有一个URI匹配器,这个URI用于表示这个ContentProvider所提供的数据
  
  实现步骤:

       1、定义一个类,继承ContentProvider

       2、在manifests文件下的AndroidManifest中注册

  3、实例化一个UriMatcher  

       4、创建一个静态(static)块添加uri
  5、实现ContentProvider的所有方法(query、insert、update、delete、getType、onCreate)

 代码实现如下:

项目名:ContentProvider_Dome_one

1、定义一个类,继承ContentProvider

public class MyContentProvider extends ContentProvider {
    public static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    MySql mySql;
    SQLiteDatabase sqLiteDatabase;

    static {
/**
 *参数一:String authority: 填写注册的authority
 *参数二String path: 方法的标记
 *参数三 int code: 两方匹配后的返回值 除了-1  因为-1是不匹配
 * uri由voi.name/query组成
 */
        uriMatcher.addURI("voi.name", "query", 0);
        uriMatcher.addURI("voi.name", "insert", 1);
        uriMatcher.addURI("voi.name", " delete",2);
        uriMatcher.addURI("voi.name", " update",3);

    }

    @Override
    public boolean onCreate() {
        mySql = new MySql(getContext());
        sqLiteDatabase = mySql.getWritableDatabase();
        return false;
    }

    /**
     * @param uri           方法匹配的uri
     * @param projection    列名
     * @param selection     查询条件
     * @param selectionArgs 查询条件的值
     * @param sortOrder     排序
     * @return
     */
    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
        if (uriMatcher.match(uri) == 0) {//匹配成功
            /**
             * String table        表名
             * String[] selection  列名
             * String selection    查询条件
             * String[] selectionArgs  查询条件的值
             * String groupBy      分组
             * String having       拥有条件
             * String orderBy      排序
             */
            Cursor cursor = sqLiteDatabase.query("user", projection, selection, selectionArgs, null, null, sortOrder);
            return cursor;//返回数据集
        } else {
            //失败
            return null;
        }
    }

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

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        if (uriMatcher.match(uri) == 1) {
            /**insert返回值   当前插入的行数*/
            sqLiteDatabase.insert("user", null, values);
            Uri uri1=Uri.parse("voi.name/insert");
            return  uri1;
        } else {
            return null;
        }
    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
       if(uriMatcher.match(uri)==2){
           /**delete返回值  表示被影响(删除)的行数*/
        int code=  sqLiteDatabase.delete("user",selection,selectionArgs);
           return code;
       }else{
           return -1;
       }
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
        if(uriMatcher.match(uri)==3){
            /**update 表示被影响(修改)的行数*/
          int code=  sqLiteDatabase.update("user",values,selection,selectionArgs);
            return code;
        }else{
            return -1;
        }

    }
}
2、在manifests文件下的AndroidManifest中注册

 <provider
            android:authorities="voi.name"
            android:name=".provider.MyContentProvider"
            android:exported="true"/>

Authorities 名称随便取,但是自己要记住

Name:和Activity一样,是自定义ContentProvider的路径和名字

Exported 是否暴露数据,写true

3、实例化一个UriMatcher  

 public static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

4、创建一个静态(static)块添加uri

    static {
/**
 *参数一:String authority: 填写注册的authority
 *参数二String path: 方法的标记
 *参数三 int code: 两方匹配后的返回值 除了-1  因为-1是不匹配
 * uri由voi.name/query组成
 */
        uriMatcher.addURI("voi.name", "query", 0);
        uriMatcher.addURI("voi.name", "insert", 1);
        uriMatcher.addURI("voi.name", " delete",2);
        uriMatcher.addURI("voi.name", " update",3);
    }
5、实现ContentProvider的所有方法(query、insert、update、delete、getType、onCreate)

public class MyContentProvider extends ContentProvider {
    public static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    MySql mySql;
    SQLiteDatabase sqLiteDatabase;

    static {
/**
 *参数一:String authority: 填写注册的authority
 *参数二String path: 方法的标记
 *参数三 int code: 两方匹配后的返回值 除了-1  因为-1是不匹配
 * uri由voi.name/query组成
 */
        uriMatcher.addURI("voi.name", "query", 0);
        uriMatcher.addURI("voi.name", "insert", 1);
        uriMatcher.addURI("voi.name", " delete",2);
        uriMatcher.addURI("voi.name", " update",3);
    }

    @Override
    public boolean onCreate() {
        mySql = new MySql(getContext());
        sqLiteDatabase = mySql.getWritableDatabase();
        return false;
    }

    /**
     * @param uri           方法匹配的uri
     * @param projection    列名
     * @param selection     查询条件
     * @param selectionArgs 查询条件的值
     * @param sortOrder     排序
     * @return
     */
    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
        if (uriMatcher.match(uri) == 0) {//匹配成功
            /**
             * String table        表名
             * String[] selection  列名
             * String selection    查询条件
             * String[] selectionArgs  查询条件的值
             * String groupBy      分组
             * String having       拥有条件
             * String orderBy      排序
             */
            Cursor cursor = sqLiteDatabase.query("user", projection, selection, selectionArgs, null, null, sortOrder);
            return cursor;//返回数据集
        } else {
            //失败
            return null;
        }
    }

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

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        if (uriMatcher.match(uri) == 1) {
            /**insert返回值   当前插入的行数*/
            sqLiteDatabase.insert("user", null, values);
            Uri uri1=Uri.parse("voi.name/insert");
            return  uri1;
        } else {
            return null;
        }
    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
       if(uriMatcher.match(uri)==2){
           /**delete返回值  表示被影响(删除)的行数*/
        int code=  sqLiteDatabase.delete("user",selection,selectionArgs);
           return code;
       }else{
           return -1;
       }
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
        if(uriMatcher.match(uri)==3){
            /**update 表示被影响(修改)的行数*/
          int code=  sqLiteDatabase.update("user",values,selection,selectionArgs);
            return code;
        }else{
            return -1;
        }

    }
}
由于在这里的 ContentProvider,我使用了数据库,所以数据库的代码如下:

public class MySql extends SQLiteOpenHelper {
    public static String NAME="user";
    public static int VERSION=1;
    public MySql(Context context) {
        super(context, NAME, null, VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table user(_id integer primary key autoincrement ,name varchar(20),age int)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}
MainActivity中的代码:

这里我在数据库中增加了数据

public class MainActivity extends AppCompatActivity {
    SQLiteDatabase sqLiteDatabase;
    MySql mysql;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mysql = new MySql(this);
        sqLiteDatabase = mysql.getWritableDatabase();
        init();
    }

    private void init() {
        ContentValues cv = new ContentValues();
        String name = "a";
        int age = 20;
        cv.put("name", name);
        cv.put("age", age);
        sqLiteDatabase.insert("user", null, cv);
        /**
         * String table        表名
         * String[] selection  列名
         * String selection    查询条件
         * String[] selectionArgs  查询条件的值
         * String groupBy      分组
         * String having       拥有条件
         * String orderBy      排序
         */
        Cursor cursor = sqLiteDatabase.query("user", null, null, null, null, null, null);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                String names = cursor.getString(0);
                int ages=cursor.getInt(1);
                Log.i("a",names+""+ages);
            }
        }
    }
}
P:如果另一个程序觉得 上面这个程序数据库的东西非常好,它想拿到上面这个数据库中的东西,怎么办呢??这个时候ContentProvider的作用就发挥出来了

以下程序实现访问ContentProvider_Dome_one

1、新建一个工程,在Activity中获取内容解析者

2、在xml中布局中,设置4个Button,方便测试

3、在Activity中监听对应的Button,实现对应的方法

代码实现如下:

项目名:ContentProvider_Dome_Two

1、新建一个工程,在Activity中获取内容解析者

public class MainActivity extends AppCompatActivity {
    ContentResolver contentResolver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /**ContentResolver内容解析者
         * 1.获取内容解析者*/
        contentResolver = getContentResolver();
    }

2、在xml中布局中,设置4个Button,方便测试

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:onClick="insert_but"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="增加"/>
    <Button
        android:onClick="delete_but"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="删除"/>
    <Button
        android:onClick="update_but"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="修改"/>
    <Button
        android:onClick="query_but"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="查询"/>
</LinearLayout>

3、在Activity中监听对应的Button,实现对应的方法

public void query_but(View view){//查询
        Uri uri = Uri.parse("content://voi.name/query");
        /**
         * Uri uri :    content://voi.name(填写注册的authority)/query(方法的标记)
         * String[] projection 列名
         * String[] selection 查询条件
         * String[] selectionArgs 查询条件的值
         * String sortOrder  排序
         */
        Cursor cursor = contentResolver.query(uri, null, null, null, null);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                String name = cursor.getString(0);
                int age = cursor.getInt(1);
                Log.d("MainActivity_dome", name + "我是其他程序" + age);
            }
        }
    }
    public void insert_but(View view){//增加
        Uri uri=Uri.parse("content://voi.name/insert");
        ContentValues values=new ContentValues();
        values.put("name","coco");
        values.put("age",12);
        contentResolver.insert(uri,values);
    }
    public void delete_but(View view){//删除
        Uri uri=Uri.parse("content://voi.name/delete");
        contentResolver.delete(uri,"name=?",new String[]{"coco"});
    }
    public void update_but(View view){//修改
        Uri uri=Uri.parse("content://voi.name/update");
        ContentValues values=new ContentValues();
        values.put("age",2);
        contentResolver.update(uri,values,"name=?",new String[]{"coco"});

    }









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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值