ContentProvider的使用(2)

1,ContentProvider 的使用  :

首先创建:server端(服务器端),他的作用是提供数据存储位置,以及提供接口给客户端进行数据操作;

提供一个数据库:


public class SqliteHelper extends SQLiteOpenHelper{
	private static final String NAME="info.db";
	private static final int VERSION =1;

	public SqliteHelper(Context context, String name, CursorFactory factory,
			int version) {
		super(context, name, factory, version);
		// TODO Auto-generated constructor stub
	}
	public SqliteHelper(Context context) {
		super(context, NAME, null, VERSION);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		String sql = "create table person(_id integer primary key,name varchar(16),age integer)";
		db.execSQL(sql);
		
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
		if(newVersion !=oldVersion){
			Log.i("==TAG==", "数据库版本发生改变。。。");
		}
	}
	
	
	@Override
	public void onOpen(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		super.onOpen(db);
		
		Log.i("==TAG==", "数据库被打开。。。");
	}

}

之后自定义一个ContentProvider:

package org.qianfeng.contentprovider;

import android.content.ContentProvider;
import android.content.ContentResolver;
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 SqliteHelper helper ;
	
	private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
	
	private static final int QUERY = 1;//查询的返回码
	private static final int INSERT = 2;//插入的返回码
	private static final int UPDATE = 3;//更新的返回码
	private static final int DELETE = 4;//删除的返回码
	
	static {
		/**
		 * 第一个参数:当前contentprovider的权限设置
		 * 第二个参数:访问uri的地址
		 * 第三个参数:如果client端的uri访问当前的地址匹配时的返回码
		 */
		uriMatcher.addURI("org.qianfeng.contentprovider.MyContentProvider", "query", QUERY);
		uriMatcher.addURI("org.qianfeng.contentprovider.MyContentProvider", "insert", INSERT);
		uriMatcher.addURI("org.qianfeng.contentprovider.MyContentProvider", "update", UPDATE);
		uriMatcher.addURI("org.qianfeng.contentprovider.MyContentProvider", "delete", DELETE);
	//	String str ="content://org.qianfeng.contentprovider.MyContentProvider/query";
	}
	
	/**
	 * 提供给当前程序使用
	 * 当contentprovider创建时  系统回调方法
	 */
	@Override
	public boolean onCreate() {
		// TODO Auto-generated method stub
		//得到SqliteHelper对象
		helper = new SqliteHelper(getContext());
		return false;
	}

	/**
	 * 提供给客户端程序访问使用 
	 * 
	 * 作用:查询当前应用程序的数据  返回cursor对象
	 */
	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		// TODO Auto-generated method stub
		Cursor cursor = null;
		if(uriMatcher.match(uri)==QUERY){
			SQLiteDatabase db = helper.getWritableDatabase();
			cursor=db.query("person", null, selection, selectionArgs, null, null, sortOrder);
		}
	
		return cursor;
	}
	/**
	 * 返回contentUri的类型
	 */
	@Override
	public String getType(Uri uri) {
		// TODO Auto-generated method stub
		return null;
	}
	/**
	 * 提供给客户端程序使用
	 * 
	 * 作用:向当前应用程序添加数据 返回的是当前插入数据的row的uri对象
	 */
	@Override
	public Uri insert(Uri uri, ContentValues values) {
		// TODO Auto-generated method stub
		if(uriMatcher.match(uri)==INSERT){
			SQLiteDatabase db  = helper.getWritableDatabase();
			db.insert("person", null, values);
		}
		return null;
	}
	/**
	 * 提供给客户端程序使用
	 * 
	 * 作用: 删除当前应用程序的数据  返回的是删除数据row的个数
	 */
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		// TODO Auto-generated method stub
		int count =0;
		if(uriMatcher.match(uri)==DELETE){
			SQLiteDatabase db = helper.getWritableDatabase();
			count=db.delete("person", selection, selectionArgs);
		}
		return count;
	}
	/**
	 * 提供给客户端程序使用
	 * 
	 * 作用:更改当前应用程序的数据 返回的是更新数据row的个数
	 */
	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		// TODO Auto-generated method stub
		int count =0;
		if(uriMatcher.match(uri)==UPDATE){
			SQLiteDatabase db = helper.getWritableDatabase();
			count =db.update("person", values, selection, selectionArgs);
		}
		return count;
	}

}

当然了 ContentProvider是四大主键之一 所以需要注册:

 <provider android:name="org.qianfeng.contentprovider.MyContentProvider"
            android:authorities="org.qianfeng.contentprovider.MyContentProvider"
            android:exported="true"
            >
          
        </provider>

这样  ContentProvider服务端就注册完成了;




2,之后我们写客户端(client端):


package org.qianfeng.contentproviderclient;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.Menu;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity {
	
	private ListView lv;
	private SimpleCursorAdapter adapter;
	private ContentResolver contentResolver;
	
	private static final String queryPath="content://org.qianfeng.contentprovider.MyContentProvider/query";
	private static final String insertPath="content://org.qianfeng.contentprovider.MyContentProvider/insert";
	private static final String updatePath="content://org.qianfeng.contentprovider.MyContentProvider/update";
	private static final String detelePath="content://org.qianfeng.contentprovider.MyContentProvider/detele";
	

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		contentResolver = getContentResolver();
		lv = (ListView) findViewById(R.id.lv);
		Cursor cursor = contentResolver.query(Uri.parse(queryPath), null, null, null, null);
		adapter = new SimpleCursorAdapter(MainActivity.this, 
											R.layout.item, 
											cursor, 
											new String[]{"name","age"},
											new int []{R.id.textView1,R.id.textView2});
		
		lv.setAdapter(adapter);
		
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	
	public void onclick (View v){
		switch (v.getId()) {
		case R.id.btn_add:
			insertData();
			break;
		case R.id.btn_update:
			updateData();
			break;
		case R.id.btn_delete:
			deleteData();
			break;
		case R.id.btn_query:
			
			break;

		default:
			break;
		}
	}

	
	public void insertData(){
		ContentValues values = new ContentValues();
		values.put("_id", 1);
		values.put("name", "zhangsan");
		values.put("age", 25);
		
		contentResolver.insert(Uri.parse(insertPath), values);
		values = new ContentValues();
		values.put("_id", 2);
		values.put("name", "lisi");
		values.put("age", 33);
		
		contentResolver.insert(Uri.parse(insertPath), values);
	}
	
	
	public void updateData(){
		ContentValues values=new ContentValues();
		values.put("name","赵四");
		contentResolver.update(Uri.parse(updatePath), values,"_id=?", new String[]{1+""});
	}
	
	 public void deleteData(){
		 int count=contentResolver.delete(Uri.parse(detelePath), "_id=?", new String[]{1+""});
		 if(count>0){
				Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_SHORT).show();
		 }else{
				Toast.makeText(MainActivity.this, "删除失败", Toast.LENGTH_SHORT).show();
		 }
	 }
		
	
}

这样  就完成了一个自定义的ContentProvider;





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值