ContentProvider 完全屏蔽的了資料提供者的資料存取方式,只要通過調用ContentProvider提供的借口就可以去所有的資料進行操作
ContentProvider資料模式類似於資料庫的表,每一行都是一條資料,每一列都具有相同的資料類型,其通過URI來擷取資料來源,其使用的URI文法結構如下:
content://<authority>/<data_path>/<id>
(content://)表示首碼,表示該URI用於ContentProvider定位資源,無須修改
<authority>表示授權者的名稱,用來確定具體由哪一個Contentprovider來提供資源
<data_path>表示路徑,用來確定請求的是哪個資料集
例如:content://com.lonuery.mycontentprovider/abc 表示的就是在com.lonuery.mycontentprovider 包下的資料集abc
一:建立資料提供者
一般分為三步:1:繼承ContentProvider,實現基本資料操作的六個函數 2:聲明contenturi 實現UriMatcher 3:註冊ContentProvider
下面是一個建立資料提供者的小例子:
public class MyProvider extends ContentProvider {Context context;SQLiteDatabase sdb;private static UriMatcher uriMatche;//用來分析用戶端那發來的額URI到底數個什麼樣的URIstatic {uriMatche = new UriMatcher(UriMatcher.NO_MATCH);uriMatche.addURI("com.lonuery.mycontextprovider","abc", 1);//authority 一般用包名指定(保證全球唯一)//path:取資料的路徑,取資料的方式//code 匹配的結果//content://com.lonuery.DatabaseServer/abc/1 取單條資料,abc後數字為幾就表示取幾條資料,如果沒有那就是多條//content://com.lonuery.DatabaseServer/abc 取多條資料uriMatche.addURI("com.lonuery.mycontextprovider", "abc/#", 2);};//初始化UriMatcher (添加的匹配的規則)//做白日夢的人,上不了最前線,敢愛敢做的人超級精彩!@Overridepublic int delete(Uri arg0, String arg1, String[] arg2) {String argId = arg0.getPathSegments().get(1);int delcount = sdb.delete("student", "_id=?", new String[]{argId});return delcount;}@Overridepublic String getType(Uri arg0) {String retString = null;switch (uriMatche.match(arg0)) {case 2:retString = "vnd.android:cursor.item/vnd.com.lonuery.mycontextprovider.abc";break;case 1:retString="vnd.android:cursor.dir/vnd.com.lonuery.mycontextprovider.abc";break;default:break;}return retString;}@Overridepublic Uri insert(Uri arg0, ContentValues arg1) {long retId = sdb.insert("Student", null,arg1);if(retId>0){Uri tempUri = Uri.parse("com.lonuery.mycontextprovider/abc");Uri newUri = ContentUris.withAppendedId(tempUri,retId);return newUri;}throw new SQLException("資料插入失敗"+arg0);}/* * 建立資料庫*/@Overridepublic boolean onCreate() { Context context = getContext(); DatabaseHepler databaseHepler = new DatabaseHepler(context, "Student.db", null, 1);sdb = databaseHepler.getWritableDatabase();if(sdb!=null){return true;//建立成功則返回true}return false;}@Overridepublic Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,String arg4){Cursor cursor=null;switch (uriMatche.match(arg0)) {case 2://單條資料 String argId = arg0.getPathSegments().get(1);
cursor = sdb.query("Student", arg1, "_id=?", new String[]{argId},null, null, null);break;case 1://多條資料cursor =sdb.query("Student", null, null, null, null, null, arg4);break;default:break;}return cursor;}@Overridepublic int update(Uri arg0,
ContentValues arg1, String arg2, String[] arg3) {String argId = arg0.getPathSegments().get(1);int upcount = sdb.update("School",arg1, "_id=?", new String[]{argId});return upcount;}public static class DatabaseHepler extends SQLiteOpenHelper{String str = "create
table Student(_id Integer primary key autoincrement,name varchar(20),age varchar(20),sex varchar(20))";public DatabaseHepler(Context context, String name,CursorFactory factory, int version) {super(context, name, factory, version);// TODO Auto-generated constructor
stub}@Overridepublic void onCreate(SQLiteDatabase arg0) {arg0.execSQL(str);}@Overridepublic void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {// TODO Auto-generated method stub}}}
通過content使用資料提供者的資料,進行,插入,單行查詢,多行查詢,刪除行,更新行
public class ClientActivity extends Activity implements OnClickListener{Button btnInsert,btnQuerySingle,btnQueryMore,btnDelete,btnUpDate;TextView tv;EditText et;ContentResolver cr; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_client); cr = getContentResolver();//得到資料共用的用戶端 btnInsert = (Button)findViewById(R.id.button1); btnQuerySingle =(Button)findViewById(R.id.button2); btnQueryMore =(Button)findViewById(R.id.button3); btnUpDate =(Button)findViewById(R.id.button4); btnDelete =(Button)findViewById(R.id.button5); tv =(TextView)findViewById(R.id.textView1); et =(EditText)findViewById(R.id.editText1); btnInsert.setOnClickListener(this); btnQueryMore.setOnClickListener(this); btnQuerySingle.setOnClickListener(this); btnUpDate.setOnClickListener(this); btnDelete.setOnClickListener(this); }@Overridepublic void onClick(View arg0) {switch (arg0.getId()) {case R.id.button1:String baseuri = "content://com.lonuery.mycontextprovider/abc";Uri uri = Uri.parse(baseuri);ContentValues cv = new ContentValues();cv.put("name", "你妹");cv.put("age", "23");cv.put("sex", "男");cr.insert(uri, cv);break;case R.id.button2:String queryBaseUri = "content://com.lonuery.mycontextprovider/abc";String id = et.getText().toString();String queryOneUri = queryBaseUri + "/" + id;// content://com.newer.DataBaseServer/abc/7Cursor cursorOne = cr.query(Uri.parse(queryOneUri), null, null, null, null);if (cursorOne.moveToFirst()) {String idStr =cursorOne.getString(cursorOne.getColumnIndex("_id"));String name =cursorOne.getString(cursorOne.getColumnIndex("name"));String sex =cursorOne.getString(cursorOne.getColumnIndex("sex"));String age =cursorOne.getString(cursorOne.getColumnIndex("age"));tv.setText(" "+idStr + " " + name + " " + sex + " " + age + " \n");}break;case R.id.button3:String queryAllUri = "content://com.lonuery.mycontextprovider/abc";Cursor cursor = cr.query(Uri.parse(queryAllUri), null, null, null, null);tv.setText("");if (cursor.moveToFirst()) {do {String idMany =cursor.getString(cursor.getColumnIndex("_id"));String name =cursor.getString(cursor.getColumnIndex("name"));String sex =cursor.getString(cursor.getColumnIndex("sex"));String age =cursor.getString(cursor.getColumnIndex("age"));tv.append(" "+idMany + " " + name + " " + sex + " " + age + " \n");} while(cursor.moveToNext());}break;case R.id.button5:String queryBaseUri2 = "content://com.lonuery.mycontextprovider/abc";String delId = et.getText().toString();String delOneUri = queryBaseUri2 + "/" + delId;cr.delete(Uri.parse(delOneUri), null, null);break;case R.id.button4:String updataBaseUri="content://com.lonuery.mycontextprovider/abc";String updataColumn = et.getText().toString();ContentValues updata = new ContentValues();updata.put("sex",updataColumn);cr.update(Uri.parse(updataBaseUri), updata,null,null);break;default:break;}} }