ContentProvider的使用

第一步:在AndroidManifest.xml中添加

 

 <provider android:name=".MyContentProvider" android:authorities="cn.edu.mytest"></provider>

 

第二步:继承ContentProvider

 

 

package cn.edu.database;

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 MyContentProvider extends ContentProvider{

	private MySqliteHelper helper;
	private static final UriMatcher MATCHER=new UriMatcher(UriMatcher.NO_MATCH);//Uri不匹配码,不匹配返回-1
	private static final int PERSONS=1;
	private static final int PERSON=5;
	static {   //类加载的时候执行,一般用来初始化静态变量
		MATCHER.addURI("cn.edu.mytest", "person", PERSONS);//如果匹配这个Uri(content://cn.edu.test/person),返回PERSONS
		MATCHER.addURI("cn.edu.mytest", "person/#", PERSON);
	}
	public MyContentProvider()
	{
		helper=new MySqliteHelper(this.getContext(),"test.db",null,1);
	}
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		// TODO Auto-generated method stub
		SQLiteDatabase db=helper.getWritableDatabase();
		int num=0;
		switch(MATCHER.match(uri)){
		
		case PERSONS:
			num=db.delete("product", selection, selectionArgs);
			return  num;
			
		case PERSON:
			long rowid=ContentUris.parseId(uri);
			String where ="id="+rowid;
			num=db.delete("product", where, selectionArgs);
			return num;
			
		default:
			
			throw new IllegalArgumentException("this is unknown uri:"+uri);
		}
		
		
	}

	@Override
	public String getType(Uri uri) {
		// TODO Auto-generated method stub
		switch(MATCHER.match(uri)){
		case PERSONS:
			
			return "vnd.android.cursor.dir/person";//返回是集合类型就是dir
		case PERSON:
			return "vnd.android.cursor.item/person";
		default:
			
			throw new IllegalArgumentException("this is unknown uri:"+uri);
		}
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		// TODO Auto-generated method stub
		SQLiteDatabase db=helper.getWritableDatabase();
		switch(MATCHER.match(uri)){
		case PERSONS:
			long rowid=db.insert("product", "name", values);//如果主键值是整形却增加,那么rowid就是主键值
			Uri insertUri=ContentUris.withAppendedId(uri, rowid);
			this.getContext().getContentResolver().notifyChange(uri, null);//发错数据变化通知
			return insertUri;		
		default:
			
			throw new IllegalArgumentException("this is unknown uri:"+uri);
		}
		
		
		
	}

	@Override
	public boolean onCreate() {//该方法由操作系统调用,当内容提供者的实例被创建出来以后调用,只会被调用一次
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		// TODO Auto-generated method stub
		
		return null;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		// TODO Auto-generated method stub
		return 0;
	}

}
 

 

 

第三步:在其他的应用中访问ContentProvider

 

 

public void accessContentProvider()//该方法可以在其他应用程序中调用
		{
			Uri uri=Uri.parse("content://cn.edu.mytest/person");
			ContentResolver reslover=this.getContext().getContentResolver();
			ContentValues values=new ContentValues();
			values.put("name","zhangsan");
			values.put("time", "2012");
			reslover.insert(uri, values);//会调用ContentProvider中的insert()
		}
		
		public void accessContentProviderDelete()//该方法可以在其他应用程序中调用
		{
			Uri uri=Uri.parse("content://cn.edu.mytest/person/1");
			ContentResolver reslover=this.getContext().getContentResolver();
			reslover.delete(uri,null,null);
		}
 

 

 

 

 

 

 

 

CotentProvider:可以把应用中的xml/txt/db/数据对外共享

 

使用ContentProvider可以统一数据的访问方式

 

写一个PersonProvider类继承ContentProvider

在配置清单中添加配置信息

<provider android:name=".PersonProvider" 

 

android:authorities="cn.edu.personprovide(标志)>

 

 

Uri代表了要操作的数据,Uri主要包含了两部分信息:1、需要操作的ContentProvider,

2、对ContentProvider中的什么数据进行操作   

括号代表注释

content:(这个是schema)//cn.edu.personprovide(要操作的主机名或者

 

authority)/person/10(person/1是路径,1是ID)

ContentProvider的schema已经由Android所规定,schema为:content//主机名(或叫

 

Authority)用于唯一标志这个Contentprovider,外部调用者可以根据这个标志来找到

 

它,路径可以用来表示我们要操作的数据,路径构建应根据业务而定

 

 

 

 

监听ContentProvider中数据的变化

A应用向ContentProvider中添加了一条数据

ContentProvidr发出数据变化通知B应用

在继承ContentProvider的类得inset方法中添加

this.getContext().getContentResolver().notifyChange(uri, null);//发出数据变

 

化通知

 

 

B应用要处于运行状态

在B应用的Activity的中onCreate方法中

this.getContentResolver().registerContentObserver(Uri,true,new 

 

PersonContent());

 

private class PersonContentObserver extedns ContentObserver{

在onChange方法中()

{

Uri uri=Uri.prase("content://cn.edu.test/product");

getContentResolver.qeruy(uri,null,null,"personid desc limit 1");

}

}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值