内容提供器(Content Provider)--跨程序共享数据

来源:互联网 发布:手机淘宝有什么活动 编辑:程序博客网 时间:2024/06/05 10:03

Android数据持久化的技术,包括文件存储、SharedPreferences存储、以及数据库存储。但是这三种存储方式只能在当前应用中访问。因此Content Provider提供了不同应用程序之间实现数据共享的功能。下面简单介绍一下如何使用:


1.用法:

1)使用现有的内容提供器来读取和操作相应程序中的数据

2)创建自己的内容提供器给我们程序的的数据提供外部访问接口


2.访问其他程序中的数据:ContentResolver

ContentResolver提供了一系列的方法用于对数据进行CRUD操作,其增删改查方法不接收表名参数,使用Uri参数,这个参数成为内容URI,它主要由两部分组成,权限和路径。标准的格式写法如下:content://com.example.app.provider/table(权限:content://com.example.app.provider,路径:table,table为数据库的数据表)。

得到内容URI后,要解析成Uri对象才可以做为参数传入:Uri uri = Uri.parse("content://com.example.app.provider/table")

1) 得到Uri对象后,可以使用这个对象来查询table表中的数据

Cursor cursor = getContentResolver().query(uri,projection,selection,selectionArgs,sortOrder)

得到cursor对象后,取出数据

while(cursor.moveToNext()){

String column = curcor.getString(cursor.getColunmIndex("column"));

}    curcor.close();

2) 向table表添加一条数据

ContentValues cv = new Contentvalues();

cv.put("column","text");

getContentResolver().insert(uri, cv);

3) 更新数据

ContentValues cv = new Contentvalues();

cv.put("column","");

getContentResolver().update(uri, cv,"column = ?",new String[]{"change"});

4) 删除数据

getContentResolver().detele(uri,"column = ?",new String[]{"change"})


3.例子:读取系统联系人(此处主函数省略,提供一个按钮用于点击)

@Overridepublic void onClick(View view) {    switch (view.getId()){        case R.id.btn_4:            Intent intent =  new Intent(this,CPActivity.class);            startActivity(intent);            break;    }}public class CPActivity extends Activity{    private ListView contactsListView;    private ArrayAdapter<String> adapter;    List<String> list = new ArrayList<>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_cp);   //在xml文件中只需一个ListView用于显示读取到的联系人信息即可        contactsListView = (ListView)findViewById(R.id.list_contacts);        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,list);        contactsListView.setAdapter(adapter);        getContacts();    }    private void getContacts(){        Cursor cursor =null;        try{            cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);            while (cursor.moveToNext()){                String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));                String num = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));                list.add(name+" : "+num);            }        }catch (Exception e){            e.printStackTrace();        }finally {            if(cursor != null){                cursor.close();            }        }    }}


4.创建自己的内容提供器要点

1) 新建一个类去继承ContentProvider,然后重写其六个抽象方法,其中getType()方法用于获取Uri对象岁对应的MIME类型

2) UriMatcher: 提供addURI()方法,接收三个参数,分别把权限、路径和一个自定义代码传入  

      uriMatcher.addURI("权限", "路径", "自定义代码");

      swicth(uriMatcher.match(uri)){

             case 自定义代码:

                     //操作

       }

3) MIME类型例:

     URI :  content://com.example.app.provider/table

     MIME :  vnd.android,cursor.dir/vnd.com.example.app.provider.table

     完善getType() : 

     swicth(uriMatcher.match(uri)){

             case 自定义代码:

                     return "vnd.android,cursor.dir/vnd.com.example.app.provider.table";   //操作

       }

0 0
原创粉丝点击