Android入门:ContentProvider
来源:互联网 发布:淘宝懒人装修 编辑:程序博客网 时间:2024/05/01 19:23
一、ContentProvider介绍
ContentProvider翻译为“内容提供者”;
定义:指该应用包含一些方法,供外界访问,其他应用程序可以调用该方法,比如如果应用A创建了一个数据库“test.db”,默认是私有的,即其他应用程序不能对其进行操作,但是如果应用A使用了ContentProvider,则其他应用程序可以访问该数据库;
用途:某个应用对外共享数据;
注意点:和Activity一样,都是Android 的Component之一,如果要创建,则需要在AndroidManifest.xml中设置;
好处:提供了统一的insert,update,delete,query方法,操作任何数据;
二、URI介绍
URI:类似于我们以前使用的URI,但是此处URI的目的是为了能够根据URI以及调用的方法来决定怎样操作数据,比如:
uri="..../person",调用insert方法,则表示需要插入一条person记录;
ContentProvider中使用的URI注意点:
(1)以 content:// 开头;
(2)模式为:content://authorities/path;其中authorities类似于域名或IP,用来标识操作哪个ContentProvider,path表示具体的操作;
举例:
content://org.xiazdong.providers.personprovider/person 表示调用“org.xiazdong.providers.personprovider”的方法,操作person数据;
补充:ContentUris辅助类
URI uri = ContentUris.withAppendId(URI param,int id); //为某个URI添加一个ID
比如param = "content://authorities/person",id=10,则uri = "content://authorities/person/10";
long id = ContentUris.parseId(URI uri); //提取URI中最后的ID
比如uri = "content://authorities/person/10",则返回的id=10;
三、ContentProvider开发步骤简要说明
1.创建一个类,并继承ContentProvider,比如PersonProvider;
2.在AndroidManifest.xml中设置:
<provider android:name=".PersonProvider" android:authorities="org.xiazdong.provides.personprovider"/>
3.定义UriMatcher,
private UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); //创建一个URI匹配器,参数为不匹配时的返回值
在onCreate中使用matcher.addURI("authorities","path",code); //加入匹配的URI,如果匹配,则matcher.match(uri)返回code;
如果要匹配:content://authorities/path/数字 ,则matcher.addURI("authorites","path/#",code);
4.重写:
onCreate():用于为操作数据做准备;
insert:插入数据,返回插入的记录所代表的URI;
update:更新数据,返回操作影响的记录行数;
delete:删除数据,返回操作影响的记录行数;
query:查询数据,返回Cursor;
getType:记录的类型,如果操作集合,则必须以vnd.android.cursor.dir开头,如果操作非集合,则必须以vnd.android.cursor.item开头,比如vnd.android.cursor.dir/person
5.外部调用:
ContentResolver resolver = this.getContext().getContentResolver();
resolver.insert();
resolver.update();
resolver.delete();
resolver.query();
四、应用实例
AndroidManifest.xml
<provider android:name=".PersonProvider"android:authorities="org.xiazdong.provides.personprovider" ></provider>
PersonProvider.java
package org.xiazdong.db;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 DatabaseHelper helper;private SQLiteDatabase db;private UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);@Overridepublic boolean onCreate() {helper = new DatabaseHelper(this.getContext());//匹配:content://org.xiazdong.provides.personprovider/person,返回值为1matcher.addURI("org.xiazdong.provides.personprovider", "person", 1);//匹配:content://org.xiazdong.provides.personprovider/person/数字,返回值为2matcher.addURI("org.xiazdong.provides.personprovider", "person/#", 2);return true;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {db = helper.getWritableDatabase();switch(matcher.match(uri)){case 1://查询所有记录return db.query("person", projection, selection, selectionArgs, null, null, null);case 2://查询特定记录long id = ContentUris.parseId(uri);String where = "id="+id;if(selection!=null&&!"".equals(selection)){//因为selection可能还包含其他的where语句,需要再加上 "and id=?"where = where + " and "+selection;}return db.query("person", projection, where, selectionArgs, null, null, null);default:throw new IllegalArgumentException("wrong uri");}}/* * 如果操作集合,则必须以vnd.android.cursor.dir开头 * 如果操作非集合,则必须以vnd.android.cursor.item开头 * */@Overridepublic String getType(Uri uri) {switch(matcher.match(uri)){case 1:return "vnd.android.cursor.dir/person";case 2:return "vnd.android.cursor.item/person";}}/* * values为插入的数据 * 返回:插入的数据所代表的URI * */@Overridepublic Uri insert(Uri uri, ContentValues values) {db = helper.getWritableDatabase();switch(matcher.match(uri)){case 1:long rowid = db.insert("person", null, values);return ContentUris.withAppendedId(uri, rowid);//返回插入的记录所代表的URIdefault:throw new IllegalArgumentException("wrong uri");}}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {db = helper.getWritableDatabase();switch(matcher.match(uri)){case 1:return db.delete("person", selection, selectionArgs);case 2://删除特定id记录long id = ContentUris.parseId(uri);String where = "id="+id;if(selection!=null&&!"".equals(selection)){where += " and "+selection;}return db.delete("person", where, selectionArgs);default:throw new IllegalArgumentException("wrong uri");}}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {db = helper.getWritableDatabase();switch(matcher.match(uri)){case 1:return db.update("person", values, selection, selectionArgs);case 2://更新特定id记录long id = ContentUris.parseId(uri);String where = "id="+id;if(selection!=null&&!"".equals(selection)){where += " and "+selection;}return db.update("person", values,where, selectionArgs);default:throw new IllegalArgumentException("wrong uri");}}}
以下我们创建一个测试类:
ContentProviderTest.java
package org.xiazdong.db.test;import org.xiazdong.db.domain.Person;import android.content.ContentResolver;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.test.AndroidTestCase;import android.util.Log;public class ContentProviderTest extends AndroidTestCase{public void testInsert()throws Exception{//插入"name=yyy,age=100"的记录Uri uri = Uri.parse("content://org.xiazdong.provides.personprovider/person");ContentResolver resolver = this.getContext().getContentResolver();ContentValues values = new ContentValues();values.put("name", "yyy");values.put("age", 100);resolver.insert(uri, values);}public void testUpdate()throws Exception{//更新id=5的记录为name=yyy,age=100Uri uri = Uri.parse("content://org.xiazdong.provides.personprovider/person/5");ContentResolver resolver = this.getContext().getContentResolver();ContentValues values = new ContentValues();values.put("name", "yyy");values.put("age", 100);resolver.update(uri, values, null, null);}public void testDelete()throws Exception{//删除id=11的记录Uri uri = Uri.parse("content://org.xiazdong.provides.personprovider/person/5");//删除id=11的记录ContentResolver resolver = this.getContext().getContentResolver();resolver.delete(uri, null, null);}public void testQuery()throws Exception{//插入全部记录并显示Uri uri = Uri.parse("content://org.xiazdong.provides.personprovider/person");//查询所有记录ContentResolver resolver = this.getContext().getContentResolver();Cursor cursor = resolver.query(uri, null, null, null, null);while(cursor.moveToNext()){Person person = new Person(cursor.getInt(cursor.getColumnIndex("id")),cursor.getString(cursor.getColumnIndex("name")),cursor.getInt(cursor.getColumnIndex("age")));Log.v("ContentProvider", person.toString());}}}
- Android入门:ContentProvider
- android ContentProvider入门
- android ContentProvider入门使用
- Android入门:ContentProvider
- Android入门:ContentProvider
- Android入门:ContentProvider
- Android中ContentProvider和ContentResolver使用入门
- Android中ContentProvider和ContentResolver使用入门
- Android中ContentProvider和ContentResolver使用入门
- Android 中ContentProvider 和 ContentResolver使用入门
- Android入门:监听ContentProvider数据改变
- ContentProvider入门
- ContentProvider入门
- 【Android】【笔记】《Android 入门经典》part 11 ContentProvider 数据共享
- android contentprovider
- android contentprovider
- Android ContentProvider
- android ContentProvider
- VMware 网络结构与编程
- VC中执行存储过程
- Apache Common HttpClient使用之七种武器
- 编写网页自动登录器、网页自动注册器、广告模拟点击器的一点思路
- 不外俄都不怪尔的
- Android入门:ContentProvider
- Redis实践:使用Pub/Sub实现对服务器群的管理监控
- 给我“空降”一个弟兄
- C++操作mysql方法
- SecureCRT中文显示乱码的解决方法
- M. 逝世性不改是所有恋情的通病。
- 高考到底在我的心里占了多重的分量
- Jakarta-Common-Codec使用笔记
- 编程珠玑番外篇-D. 高级语言怎么来的