Android开发小结Part13:实现ContentProvider操作数据库

代码实例如下:

一.Course.java
1.实体类,对应表course;
2.定义CONTENT_URI常量和对应的表字段常量

package com.cssystem.domain;

import java.io.Serializable;
import android.net.Uri;

public class Course implements Serializable {

	private int cId;
	private String cNo;
	private String name;
	private int hours;
	private int credit;
	private String tNo;
	private String tName;
	
	//URI授权者名称,对应AndroidMainfest.xml文件里provider的配置
	public static final String AUTHORITY = "com.cssystem.courseProvider";
	public static final String PATH_MULTIPLE = "course";//多条数据的数据路径
	public static final String PATH_SINGLE = "course/#";//单条数据的数据路径 #可以表示任何数字
	public static final String CONTENT_URI_STRING = "content://" + AUTHORITY + "/" + PATH_MULTIPLE;
	public static final Uri CONTENT_URI = Uri.parse(CONTENT_URI_STRING);//声明CONTENT_URI
	
	//course表相关常量
	public static final String TABLE_NAME = "course";  
         public static final String C_ID = "c_id as _id";   
         public static final String C_NO = "c_no"; 
         public static final String NAME = "name";  
         public static final String HOURS = "hours"; 
         public static final String CREDIT = "credit"; 
         public static final String T_NO = "t_no"; 
    
         public static final String MINE_TYPE_MULTIPLE = "vnd.android.cursor.dir/course";
         public static final String MINE_TYPE_SINGLE  = "vnd.android.cursor.item/course"; 
	
	……//省略get/set方法	
	
}

二.CourseProvider.java
对外共享处理类
暴露接口,实现相应的方法
*一开始写这个类的时候,貌似有些地方有点难以理解,不过照着例子写2遍,就差不多可以理解了。
package com.cssystem.contentprovider;

import com.cssystem.dao.DBManager;
import com.cssystem.domain.Course;

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.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;

public class CourseProvider extends ContentProvider {

	
	//路径匹配码
	private static final int MULTIPLE_COURSE = 1;//多条数据返回代码
	private static final int SINGLE_COURSE = 2;//单条数据的返回代码
	
	
	private static final UriMatcher uriMatcher;
	static {
		//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码  
		uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		//如果match()方法匹配
                  //content://com.cssystem.contentProvider.course/course路径,返回匹配码为1  
		uriMatcher.addURI(Course.AUTHORITY, Course.PATH_MULTIPLE, MULTIPLE_COURSE);
		//如果match()方法匹配
                  //content://com.cssystem.contentProvider.CSProvider/cssystem/123路径,返回匹配码为2
		uriMatcher.addURI(Course.AUTHORITY, Course.PATH_SINGLE, SINGLE_COURSE);
	}
	
	private DBManager dbHelper;
	private SQLiteDatabase db;
	
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		int count = 0;
		switch(uriMatcher.match(uri)){
		case MULTIPLE_COURSE:
			count = db.delete(Course.TABLE_NAME, selection, selectionArgs);
			break;
		case SINGLE_COURSE:
			String segmeng = uri.getPathSegments().get(1);
			count = db.delete(Course.TABLE_NAME, "c_id =" + segmeng, selectionArgs);
			break;
		default:
			throw new IllegalArgumentException("不支持的URI:" + uri);
		}
		getContext().getContentResolver().notifyChange(uri, null);
		return count;
	}

	/**  
	* 该方法用于返回当前Url所代表数据的MIME类型。  
	* 如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头  
	* 如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头  
	*/  
	@Override
	public String getType(Uri uri) {
		switch(uriMatcher.match(uri)){
		case MULTIPLE_COURSE:
			return Course.MINE_TYPE_MULTIPLE;
		case SINGLE_COURSE:
			return Course.MINE_TYPE_SINGLE;
		default:
			throw new IllegalArgumentException("不支持的URI:" + uri);
		}
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		long id = db.insert(Course.TABLE_NAME, null, values);
		if(id > 0){
			Uri newUri = ContentUris.withAppendedId(Course.CONTENT_URI, id);
			getContext().getContentResolver().notifyChange(newUri, null);
			return newUri;
		}
		throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
	}

	@Override
	public boolean onCreate() {
		dbHelper = new DBManager(getContext());
		dbHelper.openDatabase();
		db = dbHelper.getDatabase();
		db.execSQL("PRAGMA foreign_keys = ON;");
		if(db == null)
			return false;
		else
			return true;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
		
		switch(uriMatcher.match(uri)){
		case SINGLE_COURSE:
			//根据课程ID查询已选人数
			qb.setTables("selected");
			qb.appendWhere("c_id =" + uri.getPathSegments().get(1));
			break;
		case MULTIPLE_COURSE:
			//查询所有课程
			qb.setTables(Course.TABLE_NAME);
			break;
		default:
			throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());   	
		}
		Cursor cursor = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder);
		cursor.setNotificationUri(getContext().getContentResolver(), uri);
		return cursor;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		int count = 0;
		switch (uriMatcher.match(uri)) {
		case MULTIPLE_COURSE:
			count = db.update(Course.TABLE_NAME, values, selection, selectionArgs);
			break;
		case SINGLE_COURSE:
			String segment = uri.getPathSegments().get(1);
			count = db.update(Course.TABLE_NAME, values, "c_id =" + segment, selectionArgs);
			break;
		default:
			throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
		}
		getContext().getContentResolver().notifyChange(uri, null);
		return count;
	}

}

 
三.
在AndroidMainfest.xml里注册声明

*注意:这段配置写在<application></application>里面

<provider
    android:name="com.cssystem.contentprovider.CourseProvider"
    android:authorities="com.cssystem.courseProvider" >
    <!--
    android:name——对应CourseProvider的包名+类名
    android:authorities——对应Course的AUTHORITY  
    -->
</provider>
四.CourseActivity.java
在另一个应用中使用接口
1.首先获得一个ContentProvider
ContentProvider resolver = getContentResolver();
2.再通过URI进行数据操作
3.2个应用程序中有相同的类Course.java
import com.cssystemmanager.domain.Course;

public class CourseActivity extends Activity {

	private ContentResolver resolver; //ContentProvider提供给外界访问,ContentResolver访问别的应用数据
	private SimpleCursorAdapter adapter; //适配器,用于ListView显示时绑定
	private Cursor cursor; //结果集
             
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_course);
        
        resolver = this.getContentResolver();
        selectAllCourse();//查询所有课程信息并用ListView显示
     }

    private void selectAllCourse() {
        cursor = resolver.query(Course.CONTENT_URI, 
        			new String[]{Course.C_ID,Course.C_NO,Course.NAME,
                                        Course.HOURS,Course.CREDIT,Course.T_NO}, 
        		         null, null, null);
        if(cursor == null){
            Toast.makeText(getApplicationContext(), "暂未添加课程信息", Toast.LENGTH_SHORT).show();
            return;
        }
        //ListView显示已有课程信息
         adapter = new SimpleCursorAdapter(this, R.layout.item, cursor,   
                                          new String[]{Course.C_NO, Course.NAME, Course.HOURS,
                                                       Course.CREDIT,Course.T_NO}, 
                                          new int[]{R.id.cno, R.id.name, R.id.hours,
                                                    R.id.credit,R.id.tno});  
        ListView lvCourseList = (ListView) findViewById(R.id.lvCourseList);
        lvCourseList.setAdapter(adapter); 
    }

}

转载于:https://my.oschina.net/laiwanshan/blog/100082

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值