Android 组件 ContentProvider 内容提供者

什么是内容提供者:内容提供者是Android中的四大组件之一,可以将应用程序中的数据对外共享,我们创建一个内容提供者,通过通用的接口将数据共享。

首先要继承类 ContentProvider 对父类的方法进行重新实现


package com.example.contentprovider;

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 MyOpenHelper myOpenHelper;
	
	 // 数据库相关类  
    private SQLiteDatabase sqLiteDatabase;  
    
	// uri匹配相关
	private static UriMatcher uriMatcher;

	// 主机名称(这一部分是可以随便取得)
	private static final String authority = "com.example.contentprovider";

    // 数据表名  
    private final String Table_Name = "Content";  
	
	// 注册该内容提供者匹配的uri
	static {
		uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		/*
		 * path_chenzheng部分的字符串是随便取得,1代表着如果请求的uri与当前加入
		 * 的匹配uri正好吻合,uriMathcher.match()方法返回的值.#代表任意数字,*代表任意字符串
		 */
		uriMatcher.addURI(authority, "add", 1);// 代表当前表中的所有的记录
		uriMatcher.addURI(authority, "add/#", 2);// 代表当前表中的某条特定的记录
	}

	// 数据表中的列名映射
	private static final String _id = "id";
	private static final String name = "name";
	private static final String age = "age";
	private static final String isMan = "isMan";

	  // 版本号  
    private final int Version_1 = 1;
	
	@Override
	public boolean onCreate() {
		try {
			myOpenHelper = new MyOpenHelper(getContext(), "TestDB", null,Version_1);
		} catch (Exception e) {
			return false;
		}
		return true;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		sqLiteDatabase = myOpenHelper.getWritableDatabase();
		Cursor c = sqLiteDatabase.query(Table_Name, new String[]{"id","name","age"}, null, null, null, null, null);
		return c;
	}

	/**
	 * @description 获取当前内容提供者的MIME类型 集合类型必须添加前缀vnd.android.cursor.dir/(该部分随意)
	 *              单条记录类型添加前缀vnd,android.cursor.item/(该部分随意)
	 *              定义了该方法之后,系统会在第一次请求时进行验证,验证通过则执行crub方法时不再重复进行验证,
	 *              否则如果没有定义该方法或者验证失败,crub方法执行的时候系统会默认的为其添加类型验证代码。
	 */
	@Override
	public String getType(Uri uri) {
		int code = uriMatcher.match(uri);
		switch (code) {
		case 1:
			return "vnd.android.cursor.dir/chenzheng_java";
		case 2:
			return "vnd.android.cursor.item/chenzheng_java";
		default:
			throw new IllegalArgumentException("异常参数");
		}
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		sqLiteDatabase = myOpenHelper.getWritableDatabase();
		int code = uriMatcher.match(uri);
		switch (code) {
		case 1:
			sqLiteDatabase.insert(Table_Name, name, values);  
			break;
		default:
			throw new IllegalArgumentException("异常参数");
		}
		return uri;
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		return 0;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		int num = 0;  
		sqLiteDatabase = myOpenHelper.getWritableDatabase();
		int code = uriMatcher.match(uri);  
		switch (code) {
		case 1:
			num = sqLiteDatabase.update(Table_Name, values, selection, selectionArgs);  
			break;
		case 2:  
            long id = ContentUris.parseId(uri);  
            selection = (selection == null || "".equals(selection.trim())) ? _id  
                    + "=" + id  
                    : selection + " and " + _id + "=" + id;  
            num = sqLiteDatabase.update(Table_Name, values, selection, selectionArgs);  
			break;
		default:
			throw new IllegalArgumentException("异常参数");
		}
		return num;
	}
}

内容提供者使用Uri来操作数据,Uri包含了两部分:① 需要操作的内容提供者,② 要操作的数据


Activity 代码

package com.example.contentprovider;

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.util.Log;
import android.view.View;
import android.widget.TextView;

public class ContentProviderActivity extends Activity {
	ContentResolver reslover;
	Uri uri;
	String result = "结果:/n";
	private final static String tag = "通知";  
	private TextView textView; 
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		textView = (TextView) findViewById(R.id.textView);
		uri = Uri.parse("content://com.example.contentprovider/add");  
		reslover = getContentResolver();
	}

	public void insertContent(View view){
		insert(reslover,uri);
	}

	public void updateContent(View view){
		update(reslover,uri);
	}
	
	public void queryContent(View view) {
		Cursor cursor = query(reslover, uri);
		while(cursor.moveToNext()){
			System.out.println(cursor.getInt(cursor.getColumnIndex("id")));
			System.out.println(cursor.getString(cursor.getColumnIndex("name")));
			System.out.println(cursor.getString(cursor.getColumnIndex("age")));
		}
	}
	
	private Cursor query(ContentResolver resolver, Uri uri){
		Cursor cursor = resolver.query(uri, null, null, null, null);
		return cursor;
	}
	
	private void update(ContentResolver resolver, Uri uri){
        ContentValues contentValues = new ContentValues();  
        contentValues.put("age", 122);  
        int number = resolver.update(uri, contentValues, null, null);  
        Log.i(tag, "更新成功!");  
        result += "成功更新了" + number+"条记录";  
        textView.setText(result);  
        result = "";  
	}
	
    private void insert(ContentResolver resolver, Uri uri) {  
        ContentValues contentValues = new ContentValues();  
        contentValues.put("id", 1);
        contentValues.put("name", "张大凡");  
        contentValues.put("age", 30);  
        contentValues.put("isMan", true);  
        Uri uri2 = resolver.insert(uri, contentValues);  
        Log.i(tag, "插入成功!");  
        result += "成功插入了一条记录,uri为" + uri2;  
        textView.setText(result);  
        result = "";  
    } 
}


你可能感兴趣的:(Android)