ContentProvider实现数据共享

     ContentProvider在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对你应用中的数据进行添删改查。关于数据共享,我们知道,通过设定文件的操作模式为Content.MODE_WORLD_READABLE或Context.MODE_WORLD_WRITEABLE同样也可以对外共享数据。那么,这里ContentProvider对外共享数据相对文件共享有什么样的优势了。是这样的,如果采用文件操作模式对外共享数据,数据的访问方式会因数据存储的方式而不同,导致数据的访问方式无法统一,如:采用xml文件对外共享数据,需要进行xml解析才能读取数据;采用sharepreferences共享数据,需要使用sharepreferences API读取数据。


使用ContentProvider对外共享数据的好处是统一了数据的访问方式。

当应用需要通过ContentProvider对外共享数据时,第一步需要继承ContentProvider并重写下面方法。

public class PersonContentProvider extends ContentProvider{

    public boolean onCreate();

     public Uri insert(Uri uri, String selection, String[] selectionArgs);

     public int delete(Uri uri, String selection , String[] selectionArgs);

     public int update(Uri uri, ContentValues, String selection, String[] selectionArgs);

    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder);

    public String getType(Uri uri);

}


第二步需要在AndroidManifest.xml使用<provider>对该ContentProvider进行配置,为了能让其他应用找到该ContentProvider, ContentProvider采用了authorities(主机名/域名)对它进行了唯一标识,你可以把ContentProvider看作是一个网站(想想,网站也是提供数据的),authorities就是他的域名。

<application android:icon=.....>

     <provider android:name=".PersonProvider" android:authorities="com.example.providers.personprovider"></provider>

</application>


这里我给出一个对sqlite数据库实现ContentProvider对外共享数据的范例。

A应用:名称为db(主要代码)

package com.example.db;

import com.example.service.DbOpenHelper;

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 DbOpenHelper openHelper;
	private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
	private static final int PERSONS = 1;
	private static final int PERSON = 2;
	static{
		MATCHER.addURI("com.example.providers.personprovider", "person", PERSONS);
		
		//* 根据pesonid来删除记录
		MATCHER.addURI("com.example.providers.personprovider", "person/#", PERSON);
	}
	@Override
	public boolean onCreate() {
		openHelper = new DbOpenHelper(this.getContext());
		return false;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		SQLiteDatabase sqLiteDatabase = openHelper.getReadableDatabase();
		switch (MATCHER.match(uri)) {
		case 1:
			return sqLiteDatabase.query("person", projection, selection, selectionArgs, null, null, sortOrder);
		case 2:
			long rowid = ContentUris.parseId(uri);
			String where = "personid="+rowid;
			if(selection != null && "".equals(selection.trim())){
				where = selection+"and"+where;
			}
			return sqLiteDatabase.query("person", projection, where, selectionArgs, null, null, sortOrder);
		}
		return null;
	}

	@Override
	public String getType(Uri uri) {
		switch (MATCHER.match(uri)) {
		case 1:
			return "vnd.android.cursor.dir/person";
		case 2:
			return "vnd.android.cursor.item/person";
		}
		return null;
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		SQLiteDatabase sqLiteDatabase = openHelper.getWritableDatabase();
		switch (MATCHER.match(uri)) {
		case 1:
			long rowid = sqLiteDatabase.insert("person", "name", values);
			return ContentUris.withAppendedId(uri, rowid);

		default:
			break;
		}
		return null;
	}

	//* 删除特定personid行的记录
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		SQLiteDatabase sqLiteDatabase = openHelper.getWritableDatabase();
		switch (MATCHER.match(uri)) {
		case 1:
			return sqLiteDatabase.delete("person", selection, selectionArgs);
		case 2:
			long rowid = ContentUris.parseId(uri);
			String where = "personid="+rowid;
			if(selection != null && "".equals(selection.trim())){
				where = selection+"and"+where;
			}
			return sqLiteDatabase.delete("person", where, selectionArgs);
		}
		return 0;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		SQLiteDatabase sqLiteDatabase = openHelper.getWritableDatabase();
		switch (MATCHER.match(uri)) {
		case 1:
			return sqLiteDatabase.update("person", values, selection, selectionArgs);
		case 2:
			long rowid = ContentUris.parseId(uri);
			String where = "personid="+rowid;
			if(selection != null && "".equals(selection.trim())){
				where = selection+"and"+where;
			}
			return sqLiteDatabase.update("person", values, where, selectionArgs);
		}
		return 0;
	}
}

UriMatcher类似一个文本过滤器,它是用来匹配Uri.

第一步对其进行初始化:

UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);

第二步对其进行注册,附加Uri:

MATCHER.addURI("com.example.providers.personprovider", "person", PERSONS);
		
//* 根据pesonid来删除记录
MATCHER.addURI("com.example.providers.personprovider", "person/#", PERSON);

"com.example.providers.personprovider"就是域名,通过他可以相对应的找到特定的ContentProvider

第三步与进行Uri进行匹配:

MATCHER.match(uri)会返回一个code,code就是第二步传入的第二个参数


long rowid = ContentUris.parseId(uri);会得到uri后边对应的id.

测试代码:

package com.example.other;

import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.test.AndroidTestCase;

public class AccessProvider extends AndroidTestCase {

	public void testInsert(){
		Uri uri = Uri.parse("content://com.example.providers.personprovider/person");
		ContentResolver resolver = this.getContext().getContentResolver();
		ContentValues values = new ContentValues();
		values.put("name", "xiaohua");
		values.put("phone", "12121212");
		resolver.insert(uri, values);
	}
	
	public void testDelete(){
		Uri uri = Uri.parse("content://com.example.providers.personprovider/person/2");
		ContentResolver resolver = this.getContext().getContentResolver();
		resolver.delete(uri, null, null);
	}
	
	public void testUpdate(){
		Uri uri = Uri.parse("content://com.example.providers.personprovider/person/3");
		ContentResolver resolver = this.getContext().getContentResolver();
		ContentValues values = new ContentValues();
		values.put("name", "hanfei");
		values.put("phone", "00000000");
		resolver.update(uri, values, null, null);
	}
	
	public void testQuery(){
		Uri uri = Uri.parse("content://com.example.providers.personprovider/person");
		ContentResolver resolver = this.getContext().getContentResolver();
		Cursor cursor = resolver.query(uri, new String[]{"name","phone"}, null, null, null);
		while(cursor.moveToNext()){
			String name = cursor.getString(cursor.getColumnIndex("name"));
			String phone = cursor.getString(cursor.getColumnIndex("phone"));
			System.out.println("name="+name+" "+"phone="+phone);
		}
	}
}

下载地址:http://download.csdn.net/detail/tan313/8508063

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值