ContentProvider学习

 ContentProvider是所有应用程序之间数据存储和检索的一个桥梁,作用是使得各个应用程序之间实现数据共享。

1.首先创建包含contentprovider的Content_uri和一些字段数据的NotePad类,字段类可以继承自BaseColumns类,代码如下

package com.lordbaby.ContentProvider;

import android.net.Uri;
import android.provider.BaseColumns;

public class NotePad {
	//ContentProvider的Uri
	public static final String AUTHORITY="com.google.provider.NotePad";
	private NotePad(){}
	//一些基本常量字段
	public static final class Notes implements BaseColumns{
		private Notes(){}
		public static final Uri CONTENT_URI=Uri.parse("content://"+AUTHORITY+"/notes");
		//新的MIME类型-多个
		public static final String CONTENT_TYPE="vnd.android.cursor.dir/vnd.google.note";
		//新的MIME类型-单个
		public static final String CONTENT_ITEM_TYPE="vnd.android.cursor.item/vnd.google.note";
		//默认的排序方式
		public static final String DEFAULT_SORT_ORDER="modified DESC";
		//字段
		public static final String TITLE="title";
		public static final String NOTE="note";
		public static final String CREATEDDATE="created";
		public static final String MODIFIEDDATE="modified";
	}
}

2.然后创建自己的contentprovider类NotePadProvider,这里只写了查询和添加,以及打开创建数据库,具体实现代码如下

package com.lordbaby.ContentProvider;

import java.sql.SQLException;
import java.util.HashMap;
import java.util.ResourceBundle;

import com.lordbaby.ContentProvider.NotePad.Notes;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.content.res.Resources;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.net.Uri;
import android.text.TextUtils;

public class NotePadProvider extends ContentProvider {
	
	private static final String TAG="NotePadProvider";
	//数据库名
	public static final String DATABASE_NAME="note_pad.db";
	//数据库版本
	public static final int DATABASE_VERSION=2;
	//表名
	public static final String NOTES_TABLE_NAME="notes";
	
	public static HashMap<String,String> sNotesProjectionMap;
	
	public static final int NOTES=1;
	public static final int NOTE_ID=2;
	
	public static final String CREATE_TABLE="CREATE TABLE "
											+NOTES_TABLE_NAME
											+"("+Notes._ID
											+" INTEGER PRIMARY KEY,"
											+Notes.TITLE
											+" TEXT,"
											+Notes.NOTE
											+" TEXT,"
											+Notes.CREATEDDATE
											+" INTEGER,"
											+Notes.MODIFIEDDATE
											+" INTEGER"+");";
	private DataBaseHelper mOpenHelper;
	//用于匹配uri
	public static final UriMatcher sUriMatcher;
	static
	{
		System.out.println("start UriMatcher");
		//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码 
		sUriMatcher=new UriMatcher(UriMatcher.NO_MATCH);
		sUriMatcher.addURI(NotePad.AUTHORITY, "notes", NOTES);
		sUriMatcher.addURI(NotePad.AUTHORITY, "notes/#", NOTE_ID);
		//columnMap
		sNotesProjectionMap=new HashMap<String, String>();
		sNotesProjectionMap.put(Notes._ID, Notes._ID);
		sNotesProjectionMap.put(Notes.TITLE, Notes.TITLE);
		sNotesProjectionMap.put(Notes.NOTE, Notes.NOTE);
		sNotesProjectionMap.put(Notes.CREATEDDATE, Notes.CREATEDDATE);
		sNotesProjectionMap.put(Notes.MODIFIEDDATE, Notes.MODIFIEDDATE);
	}
	
	private static class DataBaseHelper extends SQLiteOpenHelper{

		public DataBaseHelper(Context context) {
			//在这并没有真正的创建或者打开数据库,而是在getWritableDatabase() or getReadableDatabase() 
			//被调用时才创建或者打开
			super(context,DATABASE_NAME, null, DATABASE_VERSION);
			// TODO Auto-generated constructor stub
		}
		//创建表
		@Override
		public void onCreate(SQLiteDatabase db) {
			// TODO Auto-generated method stub
			System.out.println("DataBaseHelper--------->onCreate Table");
			db.execSQL(CREATE_TABLE);
		}
		//更新数据库
		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			// TODO Auto-generated method stub
			db.execSQL("DROP TABLE IF EXISTS notes");
			onCreate(db);
		}
	}

	@Override
	public boolean onCreate() {
		// TODO Auto-generated method stub
		System.out.println("NotePadProvider-------->onCreate ");
		mOpenHelper=new DataBaseHelper(getContext());
		return true;
	}
	//查询操作
	@Override
	public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
			String sortOrder) {
		// TODO Auto-generated method stub
		SQLiteQueryBuilder qb=new SQLiteQueryBuilder();
		switch (sUriMatcher.match(uri)) {
		case NOTES:
			qb.setTables(NOTES_TABLE_NAME);
			qb.setProjectionMap(sNotesProjectionMap);
			break;
		case NOTE_ID:
			qb.setTables(NOTES_TABLE_NAME);
			qb.setProjectionMap(sNotesProjectionMap);
			//这里获取的是uri中path部分,去掉去掉"/",的部分存于List<String>中,get(1)就是第二个值
			//content://com.google.provider.NotePad/notes/1 path部分即notes/1
			qb.appendWhere(Notes._ID+"="+uri.getPathSegments().get(1));
			break;
		default:
			throw new IllegalArgumentException("Unkown URI"+uri);
			
		}
		String orderBy;
		if (TextUtils.isEmpty(sortOrder)) {
			orderBy=NotePad.Notes.DEFAULT_SORT_ORDER;
		} else {
			orderBy=sortOrder;	
		}
		System.out.println("NotePadProvider------>query");
		SQLiteDatabase db=mOpenHelper.getReadableDatabase();
		Cursor c=qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
		
		c.setNotificationUri(getContext().getContentResolver(), uri);
		return c;
	}
	//如果有自定义类型必须实现该方法
	@Override
	public String getType(Uri uri) {
		// TODO Auto-generated method stub
		System.out.println("NotePadProvider-------->getType");
		switch (sUriMatcher.match(uri)) {
		case NOTES:
			//返回新的MIME类型-多个
			return Notes.CONTENT_TYPE;
		case NOTE_ID:
			//返回新的MIME类型-单个
			return Notes.CONTENT_ITEM_TYPE;
		default:
			throw new IllegalArgumentException("Unkown Uri:"+uri);
		}
	}
	//插入数据库
	@Override
	public Uri insert(Uri uri, ContentValues initialValues) {
		// TODO Auto-generated method stub
		System.out.println("NotePadProvider---->insert");
		if (sUriMatcher.match(uri)!=NOTES) {
			throw new IllegalArgumentException("Unkown Uri:"+uri);
		}
		ContentValues values;
		if (initialValues!=null) {
			values=new ContentValues(initialValues);
		} else {
			values=new ContentValues();	
		}
		Long now=Long.valueOf(System.currentTimeMillis());
		
		if (values.containsKey(NotePad.Notes.CREATEDDATE)==false) {
			values.put(NotePad.Notes.CREATEDDATE, now);
		}
		if (values.containsKey(NotePad.Notes.MODIFIEDDATE)==false) {
			values.put(NotePad.Notes.MODIFIEDDATE, now);
		}
		if (values.containsKey(NotePad.Notes.TITLE)==false) {
			Resources r=Resources.getSystem();
			values.put(NotePad.Notes.TITLE, r.getString(android.R.string.untitled));
		}
		if (values.containsKey(NotePad.Notes.NOTE)==false) {
			values.put(NotePad.Notes.NOTE, "");
		}
		SQLiteDatabase db=mOpenHelper.getWritableDatabase();
		long rowId=db.insert(NOTES_TABLE_NAME, Notes.NOTE, values);
		if (rowId>0) {
			Uri noteUri=ContentUris.withAppendedId(NotePad.Notes.CONTENT_URI, rowId);
			System.out.println("insert---------->"+noteUri.toString());
			getContext().getContentResolver().notifyChange(noteUri, null);
			return noteUri;
		}
		System.out.println("Failed to insert row into :"+uri);
		return uri;
		
	}
	@Override
	public int delete(Uri arg0, String arg1, String[] arg2) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
		// TODO Auto-generated method stub
		return 0;
	}

}


3.Androidmainfest.xml文件中必须声明

<provider android:name="NotePadProvider"
            	android:authorities="com.google.provider.NotePad"></provider>



 

posted @ 2011-11-16 17:27  hailiang2013  阅读(161)  评论(0编辑  收藏  举报