zoukankan      html  css  js  c++  java
  • 自定义ContentProvider

    在前面调用系统ContentProvider实现了管理联系人和多媒体内容,而有的时候,我们需要自己定义ContentProvider供别人使用,下面我们实现一个简单的自定义ContentProvider,实现对数据库的增、删、改、查功能,为了方便阅读,数据仍是手动写死的,实际中应该根据业务需求从其他地方动态获取,代码如下:

    主界面:

    package com.lovo.studentmanagesystem;
    
    import com.lovo.provider.Student;
    
    import android.app.Activity;
    import android.content.ContentUris;
    import android.content.ContentValues;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.TextView;
    
    public class ContentProviderTest extends Activity {
    	private TextView show;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.content_provider);
    		show = (TextView) findViewById(R.id.content_provider_tv_show);
    	}
    
    	public void click(View v) {
    		ContentValues values = new ContentValues();
    		if (v.getId() == R.id.content_provider_btn_add) {
    			// 根据指定学生信息添加学生
    			values.put(Student.Data.NAME, "张无忌");
    			values.put(Student.Data.AGE, 23);
    			values.put(Student.Data.SEX, "男");
    			getContentResolver().insert(Student.Data.CONTENT_URI, values);
    		} else if (v.getId() == R.id.content_provider_btn_del) {
    			// 根据指定ID删除学生
    			Uri uri = ContentUris.withAppendedId(Student.Data.CONTENT_URI, 3);
    			getContentResolver().delete(uri, null, null);
    		} else if (v.getId() == R.id.content_provider_btn_update) {
    			// 根据指定ID修改学生信息
    			Uri uri = ContentUris.withAppendedId(Student.Data.CONTENT_URI, 1);
    			values.put(Student.Data.NAME, "元芳");
    			values.put(Student.Data.AGE, 28);
    			values.put(Student.Data.SEX, "男");
    			getContentResolver().update(uri, values, null, null);
    		} else if (v.getId() == R.id.content_provider_btn_find) {
    			// 查询所有学生信息
    			Cursor cursor = this.getContentResolver().query(
    					Student.Data.CONTENT_URI, null, null, null, null);
    			// 根据指定ID查询学生信息
    			// Uri uri = ContentUris.withAppendedId(Student.Data.CONTENT_URI,
    			// 1);
    			// Cursor cursor = this.getContentResolver().query(uri, null, null,
    			// null, null);
    			StringBuffer sb = new StringBuffer();
    			while (cursor.moveToNext()) {
    				int id = cursor.getInt(cursor.getColumnIndex(Student.Data._ID));
    				String name = cursor.getString(cursor
    						.getColumnIndex(Student.Data.NAME));
    				String sex = cursor.getString(cursor
    						.getColumnIndex(Student.Data.SEX));
    				int age = cursor
    						.getInt(cursor.getColumnIndex(Student.Data.AGE));
    				sb.append("此学生ID是:" + id + "  " + "姓名是:" + name + "  " + "性别是:"
    						+ sex + "  " + "年龄是:" + age + "
    ");
    			}
    			show.setText(sb.toString());
    		}
    	}
    }
    

    由于主界面的布局很简单就几个按钮和一个显示文本框,故在此就省略不写了。
    自定义的ContentProvider类:

    package com.lovo.provider;
    
    import com.lovo.dao.DBUtil;
    
    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 StudentContentProvider extends ContentProvider {
    	private UriMatcher uriMatcher;
    	private SQLiteDatabase db;
    
    	@Override
    	public boolean onCreate() {
    		// 创建注册Uri的工具类
    		uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    		uriMatcher.addURI(
    				"com.lovo.studentmanagesystem.StudentContentProvider",
    				"student", 1);
    		// 任何uri后面有内容的都会被注册成标示2。比如content://com.lovo.studentmanagesystem/student/1
    		uriMatcher.addURI(
    				"com.lovo.studentmanagesystem.StudentContentProvider",
    				"student/#", 2);
    		db = DBUtil.getInstance(this.getContext());
    		return true;
    	}
    
    	@Override
    	public Uri insert(Uri uri, ContentValues values) {
    		long id = db.insert("t_stu", null, values);
    		// 将id附加到Uri后面
    		if (id >= 0) {
    			uri = ContentUris.withAppendedId(uri, id);
    			return uri;
    		}
    		return null;
    	}
    
    	@Override
    	public int delete(Uri uri, String selection, String[] selectionArgs) {
    		int row = 0;
    		// 解析传过来的uri
    		switch (uriMatcher.match(uri)) {
    		case 1:
    			row = db.delete("t_stu", selection, selectionArgs);
    			break;
    		case 2:
    			long id = ContentUris.parseId(uri);
    			if (selection == null) {
    				selection = Student.Data._ID + "=" + id;
    			} else {
    				selection = selection + " and " + Student.Data._ID + "=" + id;
    			}
    			row = db.delete("t_stu", selection, selectionArgs);
    			break;
    		default:
    			break;
    		}
    		return row;
    	}
    
    	@Override
    	public int update(Uri uri, ContentValues values, String selection,
    			String[] selectionArgs) {
    		int row = 0;
    		// 解析传过来的uri
    		switch (uriMatcher.match(uri)) {
    		case 1:
    			row = db.update("t_stu", values, selection, selectionArgs);
    			break;
    		case 2:
    			long id = ContentUris.parseId(uri);
    			if (selection == null) {
    				selection = Student.Data._ID + "=" + id;
    			} else {
    				selection = selection + " and " + Student.Data._ID + "=" + id;
    			}
    			row = db.update("t_stu", values, selection, selectionArgs);
    			break;
    		default:
    			break;
    		}
    		return row;
    	}
    
    	@Override
    	public Cursor query(Uri uri, String[] projection, String selection,
    			String[] selectionArgs, String sortOrder) {
    		Cursor cursor = null;
    		// 解析传过来的uri
    		switch (uriMatcher.match(uri)) {
    		case 1:
    			cursor = db.query("t_stu", projection, selection, selectionArgs,
    					null, null, sortOrder);
    			break;
    		case 2:
    			// 从uri中获取id
    			long id = ContentUris.parseId(uri);
    			if (selection == null) {
    				selection = "_id=" + id;
    			} else {
    				selection = selection + " and _id=" + id;
    			}
    			cursor = db.query("t_stu", projection, selection, selectionArgs,
    					null, null, sortOrder);
    			break;
    		default:
    			break;
    		}
    		return cursor;
    	}
    
    	@Override
    	public String getType(Uri uri) {
    		return null;
    	}
    
    }
    


    专门定义常量的类:

    package com.lovo.provider;
    
    import android.net.Uri;
    import android.provider.BaseColumns;
    
    /**
     * 定义和Student相关的常量值
     * 
     * @author Administrator
     * 
     */
    public class Student {
    	public static final String AUTHORITY = "com.lovo.studentmanagesystem.StudentContentProvider";
    
    	public static final class Data implements BaseColumns {
    		public static final String NAME = "s_userName";
    		public static final String AGE = "s_age";
    		public static final String SEX = "s_sex";
    		public static final Uri CONTENT_URI = Uri.parse("content://"
    				+ AUTHORITY + "/student");
    	}
    }
    

    SQLiteOpenHelper的子类DBUtil:

    package com.lovo.dao;
    
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteDatabase.CursorFactory;
    import android.database.sqlite.SQLiteOpenHelper;
    
    public class DBUtil extends SQLiteOpenHelper {
    	private static DBUtil dbUtil;
    
    	private DBUtil(Context context, String name, CursorFactory factory,
    			int version) {
    		super(context, name, factory, version);
    	}
    
    	public static SQLiteDatabase getInstance(Context context) {
    		if (dbUtil == null) {
    			dbUtil = new DBUtil(context, "student", null, 1);
    		}
    		return dbUtil.getReadableDatabase();
    	}
    
    	@Override
    	public void onCreate(SQLiteDatabase db) {
    		try {			
    			db.execSQL("create table t_stu(_id integer primary key,s_userName text,s_age integer,s_sex text)");
    			
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    	@Override
    	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
    	}
    
    }
    

    最后不要忘了在清单文件中配置自定义的ContentProvider:

    <provider
                android:name="com.lovo.provider.StudentContentProvider"
                android:authorities="com.lovo.studentmanagesystem.StudentContentProvider" >
            </provider>




     

  • 相关阅读:
    sqlserver tips
    mysql tips
    小知识点集锦
    设计模式
    将微博或者qq空间的说说同步至博客园 wcf+js(ajax)跨域请求(1)
    WCF服务寄宿IIS与Windows服务
    C# 基础小知识之yield 关键字
    WPF命令绑定 自定义命令
    KnockOut 绑定之foreach绑定(mvc+knockout)
    P5019 铺设道路
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3177649.html
Copyright © 2011-2022 走看看