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

来源:互联网 发布:pp助手 安装mac软件 编辑:程序博客网 时间:2024/04/29 17:03

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
原创粉丝点击